从中复制代码的PDF使用的标点符号超出了此处应使用的基本ASCII字符范围:
CL-USER> (char-name #\â)
"RIGHT_SINGLE_QUOTATION_MARK"
和往常一样
引用
符号应改为使用撇号字符:
CL-USER> (char-name #\')
"APOSTROPHE"
这同样适用于
反报价单
:
CL-USER> (char-name #\â)
"LEFT_SINGLE_QUOTATION_MARK"
你应该改为写:
(set-dispatch-macro-character
`
,(read stream t nil t))))
这个
#'
之前没有必要
lambda
,因为公共Lisp还定义了
宏
已命名
兰姆达
扩展为
(function (lambda ...))
。
您可以按如下方式测试新的读取宏:
CL-USER> #?10
#<FUNCTION (LAMBDA (&REST #:G617)) {1001C541FB}>
CL-USER> (funcall *)
10
使用SBCL时,我会收到关于未使用变量的警告。这是因为代码在匿名函数中声明变量,但从不使用它们。这不是一个严重的问题,但一般来说,最好声明忽略哪些变量:
(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)))))