Emacs lisp:传递关于函数的词法范围?

时间:2015-07-25 19:19:05

标签: elisp lexical-scope

Python 3具有函数locals() ans globals(),允许将当前作用域的命名值至少以只读方式传递给函数。

在emacs lisp中我想编写一个字符串插值函数。为此,需要访问调用范围的词法变量。由于我想避免在宏发生变化时重新编译其他文件,因此明显的解决方案 - 使用宏 - 是不可行的。

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

我已经尝试了lisp--local-variables函数,但它不适用于lexical-binding t

Elisp文档中的一些相关引用

  

(在内部,词汇环境是符号值的一个列表   对,其中alist中的最后一个元素是符号't'   而不是利弊细胞。这样的alist可以作为第二个参数传递   到'eval'函数,以指定词法环境   哪个评估表格。 *注意Eval ::。大多数Emacs Lisp程序,   但是,不应该直接与词汇环境相互作用   办法;只有像调试器这样的专业程序。)

  

目前,Emacs Lisp闭包对象由列表表示   使用符号`closure'作为第一个元素,列表代表   作为第二个元素的词汇环境,以及参数列表和   身体形成剩下的元素:

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

然而,封闭物的内部结构“暴露”的事实   到Lisp世界的其余部分被认为是内部实现   详情。出于这个原因,我们建议不要直接检查或   改变闭合物体的结构。

1 个答案:

答案 0 :(得分:2)

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

毕竟,这是宏的一个非常方便的用途。

如果你在“隔离”中编写和调试宏(在你在其他代码中大量使用它之前),你需要重新编译的恐惧应该主要是恐惧。一旦调试,您不需要为现有功能更改宏,如果您需要添加新功能,那么它已经被使用了(但是,无论如何,重新编译代码可能不是一个坏主意)