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 世界的其他部分这一事实被认为是内部实现细节。因此,我们建议不要直接检查或更改闭包对象的结构。