【发布时间】:2021-12-26 17:42:34
【问题描述】:
我不明白这个:
CL-USER> (let ((x 'huh?)) (cons (boundp 'x) x))
(NIL . HUH?)
我曾预计,在上面的 let 表达式中,x 将被绑定,因此整个表达式将计算为 (t . huh?)。否则,如果(与我的预期相反)x 未绑定在let 的主体中,那么至少上面表达式的评估会导致错误(因为我已经通过了一个未绑定的变量作为cons 的第二个参数)。
为了让我更加困惑,Common Lisp HyperSpec 对 boundp says 的描述:
如果符号被绑定则返回真;否则,返回 false。
...“绑定”一词超链接到此glossary definition(我的重点)1:
bound adj., v.t. 1. 形容词。在绑定中具有相关的表示。 ``let 命名的变量绑定在它的主体内。'' 参见未绑定。 2. 形容词。具有阴影[2]另一个的本地绑定。 ``变量 print-escape 在 princ 函数中被绑定。'' 3. v.t. bind 的过去式。
此外,let 的 CLHS 文档说明了以下内容(我的重点):
...所有变量 varj 都绑定到相应的值; ...
当然,boundp(我之前已经链接到)的 HyperSpec 页面也有以下示例:
(let ((x 2)) (boundp 'x)) => false
...这确实可以证明我所观察到的实际上是“官方记录的行为”的断言是正确的,但是鉴于我上面引用的所有其他内容,这种狭隘正确的理由并不能让人感到安慰。
有人可以为我解决这个巨大的(希望只是明显的)矛盾吗?
1 我意识到上面突出显示的短语只是一个示例,说明如何在句子中使用“绑定”一词,但如果它是一个真正的反常示例声明与 Common Lisp 的实际情况完全相反。
【问题讨论】:
标签: common-lisp