【发布时间】:2018-05-24 14:28:13
【问题描述】:
我有一个关于符号和全局变量之间关系的问题。
符号值属性的超规范状态:
"如果一个符号有值属性,就说它是绑定的,这个事实可以通过函数boundp检测到。绑定符号的值单元中包含的对象是全局变量的值该符号,并且可以通过函数 symbol-value 访问。"
如果我应用以下步骤:
CL-USER> (intern "*X*")
*X*
NIL
CL-USER> (boundp '*x*)
NIL
CL-USER> (setf (symbol-value '*x*) 1)
1
CL-USER> (boundp '*x*)
T
据我了解,上述条件均已满足。应该有一个由符号命名的全局变量,变量的值是符号值。但这是错误的。
CL-USER> (describe '*x*)
COMMON-LISP-USER::*X*
[symbol]
*X* names an undefined variable:
Value: 1
; No value
CL-USER>
它必须被宣布为特殊的。
CL-USER> (proclaim '(special *x*))
; No value
CL-USER> (describe '*x*)
COMMON-LISP-USER::*X*
[symbol]
*X* names a special variable:
Value: 1
; No value
CL-USER>
你能解释一下这种行为吗?什么是“未定义的变量”,我在hyperspec中没有找到这个术语。
(我使用 SBCL 1.3.15。)
感谢您的回答。
编辑:
(由于此评论适用于以下两个答案(用户 Svante 和 coredump),因此我将其写为编辑,而不是对两个答案的评论)。
我同意 * x* 是一个全局变量的答案。
全局变量的超规范状态:
"全局变量 n.动态变量或常量变量。"
所以我现在想,SBCL之所以说它是“未定义的”,不是是否特殊,而是是动态(特殊)变量还是常量变量(hyperspec:"constant variable n.a variable, the的价值永远不会改变”)。
下面的答案中提到的第三个定义(也许我理解错了),它是一个不特殊的全局变量(而不是常量),根据超规范不存在。
你同意吗?
编辑 2:
好吧,总而言之,我想,因为超规范没有定义未定义的全局变量,所以它们不存在。
但正确的答案是,它们确实存在且未定义,这意味着它取决于如何处理它们。
谢谢你的回答,三个我都接受,但我只能标记一个。
【问题讨论】:
标签: common-lisp