"set" 函数
The "set" function
我很难理解一些有更多经验的人可能理解的代码的工作原理:
(let ((x 0))
(loop for var in '(x)
do (set var 3))
x)
我的期望是表达式应该 return 3,x 的新值,但实际上 returns 0。为什么 x 没有被重置?还有另一种方法可以遍历变量列表并为其赋值吗?
不支持使用符号访问词法变量。
Common Lisp 不允许您通过符号访问词法变量。默认情况下,变量是按词法绑定的。
特殊变量使用动态绑定。
它适用于使用动态绑定的特殊变量:
CL-USER 14 > (let ((x 0))
(declare (special x))
(loop for var in '(x) do (set var 3))
x)
3
或者您可以声明一个全局特殊变量,特殊声明扩展到 let
绑定。这也是为什么人们用命名约定在视觉上标记它们的原因。我们写 *foo*
而不是 foo
.
CL-USER 15 > (defvar *x123* 0)
*X123*
CL-USER 16 > (let ((*x123* 1))
(loop for var in '(*x123*) do (set var 3))
*x123*)
3
我很难理解一些有更多经验的人可能理解的代码的工作原理:
(let ((x 0))
(loop for var in '(x)
do (set var 3))
x)
我的期望是表达式应该 return 3,x 的新值,但实际上 returns 0。为什么 x 没有被重置?还有另一种方法可以遍历变量列表并为其赋值吗?
不支持使用符号访问词法变量。
Common Lisp 不允许您通过符号访问词法变量。默认情况下,变量是按词法绑定的。
特殊变量使用动态绑定。
它适用于使用动态绑定的特殊变量:
CL-USER 14 > (let ((x 0))
(declare (special x))
(loop for var in '(x) do (set var 3))
x)
3
或者您可以声明一个全局特殊变量,特殊声明扩展到 let
绑定。这也是为什么人们用命名约定在视觉上标记它们的原因。我们写 *foo*
而不是 foo
.
CL-USER 15 > (defvar *x123* 0)
*X123*
CL-USER 16 > (let ((*x123* 1))
(loop for var in '(*x123*) do (set var 3))
*x123*)
3