Common Lisp: 绑定和符号的区别

5
在Common Lisp中,设置绑定(LET)和符号(=变量)之间的简单区别是什么?

“...和符号(=变量)”是什么意思?你能给我们举出这两个概念的表达式的例子吗? - Paul Richter
2个回答

6
符号和变量是两种非常不同的实体。符号是某物的名称;变量是一个值的容器。变量可以由符号命名。
绑定是符号和变量之间的关联;当绑定生效时,您可以通过其名称引用变量。let表单创建这样的绑定。

如果我表达不够清晰,很抱歉。 我正在看这个教程: http://en.wikibooks.org/wiki/Common_Lisp/First_steps/Beginner_tutorial(let ((a 1))) 和 (setf a 1) 有什么区别? - martins
1
(let ((a 1)) ...) 创建一个变量(具有本地词法作用域),在“let”内部的词法上下文中将符号A与此变量绑定,并将其初始化为1。(setf a 1) 的行为可能不同:如果存在绑定A,则更改其值。如果没有绑定,则创建全局绑定A并将其初始化为1。但是,全局绑定的类型未指定,并且在Lisp实现(及其版本)之间有所不同。因此,如果您有一个名为A的变量,则setf将更改其值;否则,结果未完全指定。 - dmitry_vk

1

(let ((a 1))) 将 a 的值设置为 1,直到匹配 let 前的开括号的闭括号被找到,此时 a 将恢复到先前的值(或变为未定义)。通常在函数体中看到 let,需要局部变量在函数结束时超出作用域,因此您会在那里使用 let。

(setf a 1) 将 a 设置为 1,并假定 a 已经被先前定义(无论是通过 defparameter、defvariable 还是 let),或者 a 是一个新的特殊变量,需要一个值。

这比我说的要复杂一些,但我不确定我是否有解释它的 Lisp 技能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接