Mik*_*one 2 lisp eval common-lisp
我正在做一个小项目只是为了好玩,我添加eval了对它的支持,使调试更容易.但后来我发现了一个问题:
(let ((x 1))
(eval (1+ x)))
(defun foo (x form)
(eval form))
(foo 1 '(1+ x))
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用.有人可以解释为什么以及如何解决它?非常感谢.
首先,尽管如此
(let ((x 1))
(eval (1+ x)))
Run Code Online (Sandbox Code Playgroud)
可能看起来它确实有用(它肯定会有所作为),它可能没有做,你打算做什么.eval是一个常规函数,因此它接收调用者评估的参数.实际上,您eval使用整数值调用2- 然后将其"计算"(因为整数是自引用)到结果值2.
在
(defun foo (x form)
(eval form))
Run Code Online (Sandbox Code Playgroud)
诊断失败更容易.运行时词法绑定不是第一类对象,而是由幕后的解释器/编译器维护的.常规函数(如eval)不能访问在其调用站点定义的词法变量.
一种解决方法是使用特殊变量:
(defun foo (x form)
(declare (special x))
(eval form))
Run Code Online (Sandbox Code Playgroud)
声明告诉你的lisp实现,它x应该在其范围内动态绑定.