anchor.diff:          (set-macro-character
             #\a (lambda (strm c)
                   (declare (ignore c))
  -                (if (anaphora-suffix-p strm)
  -                  (car (pushnew (intern-anaphora (read strm t nil t))
  -                                anaphoras))
  -                  (let ((fake (make-concatenated-stream
  -                                (make-string-input-stream "\\A")
  -                                strm)))
  -                    (read fake t nil t))))
  +                (multiple-value-bind (suffix anaphora?)
  +                  (read-suffix strm)
  +                  (if anaphora?
  +                    (car (pushnew (intern-anaphora suffix) anaphoras))
  +                    (let ((fake (make-concatenated-stream
  +                                  (make-string-input-stream (concat-str "\\A" suffix))
  +                                  strm)))
  +                      (read fake t nil t)))))
             t)
           (let ((expr (funcall bqreader-fn strm nil)))
             `(lambda ,(sort anaphoras #'string<= :key #'symbol-name)
  
positive.code: ;;; preferable.
  (in-package :abackquote)
  
  (defun anaphora-suffix-p (strm)
    ;; Here, base must be 10. The definition of anaphora is the basis.
    ;; Even if *READ-BASE* is not 10.
    ;; TODO: FIXME!
    (digit-char-p (peek-char nil strm t nil t)))
  
  (defun intern-anaphora (asuffix)
    (intern (format nil "A~D" asuffix)))
  
negative.code: (read-from-string "#`(print (list ,a0 ,a1 ,(progn #`(foo ,a4) `(bar ,a2))))")
  (read-from-string "#`(print (list ,a0 ,a1 ,(progn #`(foo ,a4) #`(bar ,a2))))")
  (read-from-string "#`(print (list ,abc ,a1 ,a3))")
  (let ((*read-base* 4))
    (read-from-string "#`(print (list ,a10 (bc ,a2) ,a1 ,a0 a4))"))
  (read-from-string "#`(print (list ,a2bc ,a1 ,a3))")
  
  (read-from-string "#`(list ,a0)")
  (read-from-string "#`(list ,a1 ,a0)")
  (read-from-string "#`(list ,a\\1 ,a0)")
  (read-from-string "#`(list ,a1\\1 ,a0)")
  