我将从已经在Elisp中运行的Common Lisp中展示我想要的东西:
(defun square (x)
(* x x))
(symbol-function 'square)
;; => (lambda (x) (* x x))
Run Code Online (Sandbox Code Playgroud)
所以通过了解符号square,我想要检索它的整个身体.我看过CL:
(function-lambda-expression #'square)
;; =>
(SB-INT:NAMED-LAMBDA SQUARE
(X)
(BLOCK SQUARE (* X X)))
NIL
SQUARE
Run Code Online (Sandbox Code Playgroud)
返回结果接近我的需要,但它只在某些情况下有效.大多数时候,我得到:
(function-lambda-expression #'list)
;; =>
NIL
T
LIST
Run Code Online (Sandbox Code Playgroud)
是否有更可靠的功能呢?我知道swank-backend:arglist这非常擅长检索参数,但我找不到那里的尸体的猎犬.
似乎普通解决方案在普通的lisp中是不可能的.这可以在SLIME中做到吗?假设我总是运行SLIME,并且所有代码都是通过那里加载的.是否可以比仅使用SLIME的goto-definition并从那里复制文本更可靠地获取代码?
不可以.标准中没有强制要求保存符号中的源代码,因此任何实现都可以选择不执行此操作(这也会影响性能).
我想你可能会更频繁地通过声明获得这种行为optimize (debug 3),但我没有尝试过; 它很可能是依赖于实现的.
更新答案:由于您希望实现与Lisp图像交互的编辑器功能,我要说使用Lisp交互模式(SLIME中的LIM)正是您需要做的.