【问题标题】:Emacs lisp: Pass lexical scope as to a function?Emacs lisp:将词法范围传递给函数?
【发布时间】:2015-07-25 19:19:05
【问题描述】:

Python 3 有函数 locals()globals() 允许将当前作用域的命名值传递给函数,至少是为了只读目的。

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

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

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

来自 Elisp 文档的一些相关引述

(在内部,词法环境是一个符号值列表 对,alist 中的最后一个元素是符号 't' 而不是 而不是一个缺点细胞。这样的 alist 可以作为第二个参数传递 到 `eval' 函数,以便在 哪个来评估一个表格。 *注意评估::.大多数 Emacs Lisp 程序, 但是,不应该直接与这个词法环境交互 方式;只有调试器等专门的程序。)


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

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

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

【问题讨论】:

  • 您可以使用M-x report-emacs-bug 请求此类功能。

标签: elisp lexical-scope


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2011-06-30
    相关资源
    最近更新 更多