Python 3具有函数locals()
ans globals()
,允许将当前作用域的命名值至少以只读方式传递给函数。
在emacs lisp中我想编写一个字符串插值函数。为此,需要访问调用范围的词法变量。由于我想避免在宏发生变化时重新编译其他文件,因此明显的解决方案 - 使用宏 - 是不可行的。
是否有可能在emacs lisp中执行此操作?
我已经尝试了lisp--local-variables
函数,但它不适用于lexical-binding
t
。
(在内部,词汇环境是符号值的一个列表 对,其中alist中的最后一个元素是符号't' 而不是利弊细胞。这样的alist可以作为第二个参数传递 到'eval'函数,以指定词法环境 哪个评估表格。 *注意Eval ::。大多数Emacs Lisp程序, 但是,不应该直接与词汇环境相互作用 办法;只有像调试器这样的专业程序。)
目前,Emacs Lisp闭包对象由列表表示 使用符号`closure'作为第一个元素,列表代表 作为第二个元素的词汇环境,以及参数列表和 身体形成剩下的元素:
;; lexical binding is enabled. (lambda (x) (* x x)) => (closure (t) (x) (* x x))
然而,封闭物的内部结构“暴露”的事实 到Lisp世界的其余部分被认为是内部实现 详情。出于这个原因,我们建议不要直接检查或 改变闭合物体的结构。
答案 0 :(得分:2)
如果我这样做,我不会做一个字符串插值函数,我会创建一个字符串插值宏,它会返回一个合适的代码片段来计算正确词法环境中的插值字符串。
毕竟,这是宏的一个非常方便的用途。
如果你在“隔离”中编写和调试宏(在你在其他代码中大量使用它之前),你需要重新编译的恐惧应该主要是恐惧。一旦调试,您不需要为现有功能更改宏,如果您需要添加新功能,那么它已经被使用了(但是,无论如何,重新编译代码可能不是一个坏主意)