anchor.diff:  
   (defparameter *saved-readtable* nil)
   
  +(defmacro letitbe (expr &body body)
  +  `(let ((it ,expr))
  +     ,@body
  +     it))
   
   (eval-when (:compile-toplevel :load-toplevel :execute)
     (defun gen-reader-macro-setup-code (ch local-var shared-var)
  -    (with-gensyms (strm c suffix anaphora? banged?)
  +    (with-gensyms (strm c suffix anaphora? bangcount)
         `(set-macro-character
            ,ch
            (lambda (,strm ,c)
              (declare (ignore ,c))
  -           (multiple-value-bind (,suffix ,anaphora? ,banged?)
  +           (multiple-value-bind (,suffix ,anaphora? ,bangcount)
                (read-suffix ,strm)
  -             (cond ((and ,anaphora? ,banged?)
  -                    (car (pushnew (intern-anaphora ,suffix) ,shared-var)))
  +             (cond ((and ,anaphora? (< 0 ,bangcount))
  +                    (letitbe (intern-anaphora ,suffix)
  +                      (pushnew it (nth ,bangcount ,shared-var))))
                      (,anaphora?
  -                     (car (pushnew (intern-anaphora ,suffix) ,local-var)))
  +                     (letitbe (intern-anaphora ,suffix)
  +                       (pushnew (intern-anaphora ,suffix) ,local-var)))
                      (t (let ((*readtable* *saved-readtable*))
  -                        (read (unread-str ,strm ,ch (if ,banged?  "!" "") ,suffix)
  +                        (read (unread-str
  +                                ,strm ,ch
  +                                (make-string ,bangcount :initial-element #\!)
  +                                ,suffix)
                                 t nil t))))))
            t))))
   
  
positive.code:      (if (null *saved-readtable*)
         (let ((*saved-readtable* *readtable*)
               (*readtable* (copy-readtable))
               nest
               ,shared-var
               ,local-var)
           (declare (special ,shared-var))
           setup-reader-macros
           ,@body)
         (let ((*readtable* (copy-readtable))
               (nest t)
               ,local-var)
           (declare (special ,shared-var))
           setup-reader-macros
           ,@body))))
  
  (defun anaphora-order (anaphora)
    (parse-integer (remove-if-not #'digit-char-p (symbol-name anaphora))))
  
negative.code: (read-from-string "#`(list ,a1\\1 ,a0)")
  
  (read-from-string "#`(print (list ,a0 ,a1 ,(progn #`(foo ,a!4 #`(baz a!1)) #`(bar ,a2))))")
  (read-from-string "#`(print (list ,a0 ,a1 ,(progn #`(foo ,a!4 #`(baz a!!1)) #`(bar ,a2))))")
  (read-from-string "#`(print (list ,a0 ,a1 ,(progn #`(foo ,a!4 #`(baz a!!5)) #`(bar ,a2))))")
  
  (read-from-string "#`(list ,a0 a!d)")
  (read-from-string "#`(list ,a01 a!02)")
  