2

我已经编写了 Scheme 的 s-expression 注释 ( SRFI 62 ) 的 Common Lisp 实现:

(eval-when (:compile-toplevel
            :load-toplevel
            :execute)

  (set-dispatch-macro-character #\# #\;
    (lambda (stream char n)
      (declare (ignore char))
      (when n
        (error "Infix parameter not allowed in s-expression comment."))
      (read stream)  ; Discard the s-expression.
      (values))))

根据我对The RECURSIVE-P argument 的阅读,我的实现似乎不正确。我必须(read stream t nil t)改用(recursive-p即将参数设置为t)。我的理解正确吗?

我一直在使用上面明显不正确的实现,它似乎运行正常。如果我继续使用(read stream)而不是会发生什么(read stream t nil t)

4

1 回答 1

2

对于不正确行为的示例,让我们考虑RECURSIVE-P 参数文档中给出的三个原因中的第一个。首先,使用您的原始定义:

* (+ 1 #1=2 #;(+ #1# 3))
Reader error: Missing #1# label.

更改(read stream)(read string t nil t)给出正确的结果:

* (+ 1 #1=2 #;(+ #1# 3))
3
于 2021-09-20T06:48:35.593 回答