Lisp Eval和词汇变量

Lisp Eval和词汇变量,lisp,eval,common-lisp,Lisp,Eval,Common Lisp,我正在做一个小项目只是为了好玩,我为它添加了eval支持,使调试更容易。但后来我发现了一个问题: (let ((x 1)) (eval (1+ x))) (defun foo (x form) (eval form)) (foo 1 '(1+ x)) 上面的代码不起作用。有人能解释一下为什么以及如何解决这个问题吗?非常感谢。不过首先 (let ((x 1)) (eval (1+ x))) 可能看起来它确实起作用(它肯定做了些什么),它可能没有做,你打算做什么eval是一

我正在做一个小项目只是为了好玩,我为它添加了
eval
支持,使调试更容易。但后来我发现了一个问题:

(let ((x 1))
    (eval (1+ x)))

(defun foo (x form)
    (eval form))
(foo 1 '(1+ x))
上面的代码不起作用。有人能解释一下为什么以及如何解决这个问题吗?非常感谢。

不过首先

(let ((x 1))
  (eval (1+ x)))
可能看起来它确实起作用(它肯定做了些什么),它可能没有做,你打算做什么
eval
是一个常规函数,因此它接收调用者计算的参数。实际上,您正在使用整数值
2
调用
eval
——然后将其“计算”(因为整数是自引用的)为结果值
2

更容易诊断故障。运行时词汇绑定不是一级对象,而是由解释器/编译器在后台维护的对象。常规函数(如
eval
)无法访问在其调用站点定义的词法变量

解决方法之一是使用特殊变量:

(defun foo (x form)
  (declare (special x))
  (eval form))

声明告诉您的lisp实现,
x
应该在其范围内动态绑定。

请看,不清楚为什么要添加
EVAL
,以使调试更容易。这没有什么意义。@RainerJoswig它可以在软件运行时为我提供类似REPL的功能。为什么?Lisp已经有了一个REPL。还有一个调试器。为什么要重新发明轮子?@RainerJoswig我的软件是一个服务器,它正在监听,我无法使用REPL。。。
(defun foo (x form)
  (declare (special x))
  (eval form))