【问题标题】:Eval and lexical variables评估和词法变量
【发布时间】:2013-06-23 03:38:24
【问题描述】:

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

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

(defun foo (x form)
    (eval form))
(foo 1 '(1+ x))

上面的代码不起作用。有人可以解释一下为什么以及如何解决它吗?非常感谢。

【问题讨论】:

  • 不清楚为什么要将EVAL 添加到使调试更容易。这没有什么意义。
  • @RainerJoswig 它可以在软件运行时为我提供类似 REPL 的工具。
  • 为了什么? Lisp 已经有一个 REPL。和一个调试器。为什么要重新发明轮子?
  • @RainerJoswig 我的软件是服务器,它正在监听,我无法使用 REPL...

标签: lisp eval common-lisp


【解决方案1】:

首先

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

可能看起来它确实有效(它肯定会做某事),但它可能没有做你打算做的事情。 eval 是一个常规函数,因此它接收由调用者评估的参数。实际上,您使用整数值 2 调用 eval - 然后将其“评估”(因为整数是自引用的)结果值 2

(defun foo (x form)
  (eval form))

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多