【问题标题】:emacs: get lexically bound variable value by name [duplicate]emacs:按名称获取词法绑定的变量值[重复]
【发布时间】:2013-05-04 18:19:22
【问题描述】:

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

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

(funcall (foo2))

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

【问题讨论】:

  • 你想达到什么目的?
  • 长话短说,eval 似乎总是使用空的词汇环境进行评估。其他问题的答案中探讨了其原因。

标签: emacs elisp


【解决方案1】:

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

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

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

这可能会在与 &lt;someclosure&gt; 所在的范围相同的范围内评估 &lt;exp&gt;。如果&lt;someclosure&gt; 是字节编译的(或者我犯了错误),它将无法工作。

【讨论】:

  • 这是一个很好的解释。应该在evalsymbol-value的帮助文本和手册的“词法作用域”部分?
猜你喜欢
  • 2014-02-08
  • 1970-01-01
  • 2011-11-02
  • 2013-09-11
  • 2016-12-07
  • 1970-01-01
  • 2012-04-05
  • 2013-07-16
相关资源
最近更新 更多