1

Python 3 有这个功能locals()ans函数globals()允许将当前作用域的命名值至少出于只读目的传递给函数。

在 emacs lisp 中,我想编写一个用于字符串插值的函数。它需要访问词汇变量。由于我想避免在宏更改时重新编译其他文件,因此显而易见的解决方案——使用宏——是不可行的。

是否有可能在 emacs lisp 中执行此操作?

我已经尝试过该功能lisp--local-variables,但它不适lexical-binding用于t

Elisp 文档中的一些相关引用

(在内部,词法环境是一个符号值对的列表,列表中的最后一个元素是符号 't' 而不是一个 cons 单元格。这样的 alist 可以作为第二个参数传递给 'eval' 函数, 以便指定评估表单的词法环境。*注意 Eval::。然而,大多数 Emacs Lisp 程序不应该以这种方式直接与词法环境交互;只有专门的程序,如调试器。)


目前,一个 Emacs Lisp 闭包对象由一个列表表示,符号 `closure' 作为第一个元素,一个表示词法环境的列表作为第二个元素,参数列表和主体形式作为其余元素:

 ;; lexical binding is enabled.
 (lambda (x) (* x x))
      => (closure (t) (x) (* x x))

然而,闭包的内部结构被“暴露”给 Lisp 世界的其他部分这一事实被认为是内部实现细节。因此,我们建议不要直接检查或更改闭包对象的结构。

4

1 回答 1

2

如果我要这样做,我不会创建字符串插值函数,我会创建一个字符串插值宏,它会返回一段合适的代码片段,以在正确的词法环境中计算插值字符串。

毕竟,这是宏真正方便的用途之一。

如果您在“隔离”中编写和调试宏(在您在其他代码中大量使用它之前),您对需要重新编译的恐惧应该只是那种恐惧。调试完成后,您不需要更改现有功能的宏,如果您需要添加新功能,这不是已经使用过的任何东西(但是,偶尔重新编译代码可能不是一个坏主意,无论如何) .

于 2015-07-28T09:04:40.513 回答