Mad*_*ist 2 syntax common-lisp reader-macro
我目前正在阅读Paul Graham的"On Lisp"一书中关于读时宏的章节.
我遇到的问题如下.当我运行他的一个例子时:
(set-dispatch-macro-character #\# #\?
#’(lambda (stream char1 char2)
‘#’(lambda (&rest ,(gensym))
,(read stream t nil t))))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
No dispatch function defined for #\’
Run Code Online (Sandbox Code Playgroud)
为什么会这样?可能是因为我在REPL上运行它吗?有什么可以解决它?
从中复制代码的PDF使用的标点符号超出了您在此处应使用的基本ASCII字符范围:
CL-USER> (char-name #\’)
"RIGHT_SINGLE_QUOTATION_MARK"
Run Code Online (Sandbox Code Playgroud)
通常的引号符号应该使用撇号字符:
CL-USER> (char-name #\')
"APOSTROPHE"
Run Code Online (Sandbox Code Playgroud)
这同样适用于反引号:
CL-USER> (char-name #\‘)
"LEFT_SINGLE_QUOTATION_MARK"
Run Code Online (Sandbox Code Playgroud)
你应该写作:
(set-dispatch-macro-character #\# #\?
#'(lambda (stream char1 char2)
`#'(lambda (&rest ,(gensym))
,(read stream t nil t))))
Run Code Online (Sandbox Code Playgroud)
在#'以前是没有必要的lambda,因为Common Lisp中还定义了宏命名lambda其扩展到(function (lambda ...)).
您可以按如下方式测试新的读取宏:
CL-USER> #?10
#<FUNCTION (LAMBDA (&REST #:G617)) {1001C541FB}>
CL-USER> (funcall *)
10
Run Code Online (Sandbox Code Playgroud)
使用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)))))
Run Code Online (Sandbox Code Playgroud)