anchor.diff:  (defun get-primes(limit &key (generator :eratosthene))
     (let ((candidates 
   	 (case generator
  -	   (:atkin (atkin-sieve (get-atkin-prime-candidates-map limit)))
  -	   (:eratosthene (eratosthene-sieve limit))
  +	   (:atkin (atkin-sieve-map (get-atkin-prime-candidates-map limit)))
  +	   (:eratosthene (eratosthene-sieve-map limit))
   	   (otherwise (error "Invalid generator type provided, valid type (:atkin :eratosthene)")))))
  +    (declare (type candidate candidates))
       (loop for i from 0 to (1- (length candidates))
          when (aref candidates i)
          collect i)))
  
positive.code: (defpackage :cl-prime-sieve
    (:use :common-lisp)
    (:export :sum-of-squares
  	   :get-prime-candidates-map
  	   :atkin-sieve
  	   :get-primes))
  
  (in-package :cl-prime-sieve)
  
  (defun sum-of-squares(x y &key (a 1) (b 1))
    (+ (* a x x) (* b y y)))
  
  ;; The macro has been specifically desgined to capture 
  ;; limit and candidates variables within the caller.
  
negative.code: 
  (defun get-atkin-prime-candidates-map(limit)
    (let* ((lmt (isqrt limit))
           (candidates (make-array (1+ limit) :initial-element nil))
           (stage1 (get-sieve-function 4 1 '(1 5)))
           (stage2 (get-sieve-function 3 1 '(7)))
           (stage3 (get-sieve-function 3 -1 '(11))))
      (declare (type candidate candidates))
      (declare (optimize (speed 3)))
      (loop for x from 1 to lmt do
  	 (loop for y from 1 to lmt do
  	      (progn
  