Syntax 公共Lisp未定义分派字符

Syntax 公共Lisp未定义分派字符,syntax,common-lisp,reader-macro,Syntax,Common Lisp,Reader Macro,我目前正在阅读Paul Graham的《关于Lisp》一书中关于读取时间宏的章节 我遇到的问题如下。当我运行他的一个示例时: (set-dispatch-macro-character #\# #\? #’(lambda (stream char1 char2) ‘#’(lambda (&rest ,(gensym)) ,(read stream t nil t)))) 我得到以下错误: No dispatch function defined for #\’

我目前正在阅读Paul Graham的《关于Lisp》一书中关于读取时间宏的章节

我遇到的问题如下。当我运行他的一个示例时:

(set-dispatch-macro-character #\# #\?
  #’(lambda (stream char1 char2)
    ‘#’(lambda (&rest ,(gensym))
       ,(read stream t nil t))))
我得到以下错误:

No dispatch function defined for #\’

为什么会这样?可能是因为我在REPL上运行它吗?如何解决此问题?

从中复制代码的PDF使用的标点符号超出了此处应使用的基本ASCII字符范围:

CL-USER> (char-name #\’)
"RIGHT_SINGLE_QUOTATION_MARK"
通常的引号符号应改为使用撇号字符:

CL-USER> (char-name #\')
"APOSTROPHE"
反向报价也是如此:

你应该改为写:

(set-dispatch-macro-character #\# #\?
                              #'(lambda (stream char1 char2)
                                `#'(lambda (&rest ,(gensym))
                                     ,(read stream t nil t))))
lambda
之前不需要使用
#“
,因为Common Lisp还定义了一个名为
lambda
的宏,该宏扩展为
(函数(lambda…)

您可以按如下方式测试新的读取宏:

CL-USER> #?10
#<FUNCTION (LAMBDA (&REST #:G617)) {1001C541FB}>

CL-USER> (funcall *)
10

谢谢成功了。你能告诉我你最后的评论与什么有关吗<代码>(对于SBCL,我也有很多关于未使用变量的警告)
CL-USER> #?10
#<FUNCTION (LAMBDA (&REST #:G617)) {1001C541FB}>

CL-USER> (funcall *)
10
(set-dispatch-macro-character
 #\# #\?
 (lambda (stream &rest chars)
   (declare (ignore chars))
   (let ((rest (gensym)))
     `(lambda (&rest ,rest)
        (declare (ignore ,rest))
        ,(read stream t nil t)))))