gpt4 book ai didi

syntax - Common Lisp 未定义调度字符

转载 作者:行者123 更新时间:2023-12-02 09:54:04 26 4
gpt4 key购买 nike

我目前正在阅读 Paul Graham 的《On 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"

反引号也是如此:

CL-USER> (char-name #\‘)
"LEFT_SINGLE_QUOTATION_MARK"

你应该这样写:

(set-dispatch-macro-character #\# #\?
#'(lambda (stream char1 char2)
`#'(lambda (&rest ,(gensym))
,(read stream t nil t))))

lambda 之前不需要 #',因为 Common Lisp 还定义了一个名为 lambda,它扩展为(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)))))

关于syntax - Common Lisp 未定义调度字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49676801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com