1

以下不适用于 void 变量错误。应该用什么eval替换才能使其正常工作?

;; -*- lexical-binding: t -*-
(defun foo2 ()
  (let ((b 'lkj))
    (lambda ()
      (eval 'b t))))

(funcall (foo2))

symbol-value也不起作用(如文档所述)。

4

1 回答 1

3

按名称查找变量的值从根本上与正确的词法作用域不兼容,因为正确的词法作用域允许 alpha 重命名,即(始终)重命名变量不应该影响结果。

当然,如果你真的必须知道,你可以在某些情况下破解一些东西,比如:

(funcall `(closure ,(nth 1 <someclosure>) () <exp>))

<exp>它可能在与来自哪里的范围相同的范围内进行评估<someclosure><someclosure>如果是字节编译(或者如果我犯了错误),它将不起作用。

于 2013-05-05T03:02:34.133 回答