Emacs Elisp:使符号函数返回源?

Emacs Elisp:使符号函数返回源?,emacs,elisp,Emacs,Elisp,以下是设置: (德芬广场(x) (*x)) ;; 广场 (符号功能“方形”) ;; (λ(x)(*x x)) (字节编译平方) ;; #[(x)“\211\u207”[x]2] (符号功能“方形”) ;; #[(x)“\211\u207”[x]2] 在对square进行字节编译后,是否有方法获取源代码(lambda(x)(*x)) 我能想到的两个用途是内联当前函数调用 并在中执行调试步骤 我尝试过使用查找定义noselect来获取源代码, 但我不知道是否有更好的方法,因为有时会提高效率 (er

以下是设置:

(德芬广场(x)
(*x))
;; 广场
(符号功能“方形”)
;; (λ(x)(*x x))
(字节编译平方)
;; #[(x)“\211\u207”[x]2]
(符号功能“方形”)
;; #[(x)“\211\u207”[x]2]
在对
square
进行字节编译后,是否有方法获取源代码
(lambda(x)(*x))

我能想到的两个用途是内联当前函数调用 并在中执行调试步骤

我尝试过使用
查找定义noselect
来获取源代码, 但我不知道是否有更好的方法,因为有时会提高效率

(error "Don't know where ... is defined")

无法获取函数对象的源。字节编译不是内射函数,因此无法还原它。即使忽略宏扩展,也没有从操作码到Lisp表达式的直接映射

无论如何,我看不到这方面的用例

调试 要进入调试功能,请导航到其定义(即
查找定义
)并插入调试定义(例如使用edebug)。这是合理调试Emacs Lisp函数的唯一方法。您不能使用函数单元格的内容进行调试,因为它要进行宏扩展

因此,功能单元看起来可能与实际定义完全不同。如果在函数单元中发现一个bug,那么在实际函数定义中很难找到相同的bug

内联
对于内联,使用宏或
defsubt
在Emacs Lisp中定义内联函数。但是,请注意不要意外地在库的公共接口上公开这些函数,因为编译时内联函数将编译时依赖性强加于库,因此需要为库的每个版本重新编译依赖库。由于package.el还不支持,宏和替换很容易造成破坏。

Emacs跟踪在哪个文件中定义了哪个函数名(该信息保存在
加载历史记录中)。为了找到定义,Emacs会在
加载历史记录中查找,如果函数在那里列出,它会查找相应的源文件,然后在该文件中查找类似于函数定义的内容(使用regexps)。这就是
find definition noselect
所做的


至于源代码,一般来说,没有Emacs不保留源定义。如果使用
cl-defsubt
定义函数,则源代码将保留,否则就不会保留。对于Edebug来说,拥有源代码并没有任何帮助(因为Edebug不仅需要源代码,还需要每个子表达式的精确位置);对于普通调试,也不需要源代码(您可以始终单击函数名跳转到源代码);对于内联,也不需要源代码(字节编译器确实可以在源代码级别内联,但也可以在字节代码级别内联)。

您误解了内联部分。我指的是内联扩展,即在源代码内部将
(第5方格)
替换为
(*55)
。调试也是如此:在上述情况下,我想跳转到
square
的定义,并在顶层将
arg
设置为
5
。这没什么错。我不喜欢edebug,因为它使源代码成为只读的。我更喜欢在调试时编写代码。