如何从Common Lisp中的函数符号中获取函数表达式?

abo*_*abo 2 common-lisp

我将从已经在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这非常擅长检索参数,但我找不到那里的尸体的猎犬.

UPDATE

似乎普通解决方案在普通的lisp中是不可能的.这可以在SLIME中做到吗?假设我总是运行SLIME,并且所有代码都是通过那里加载的.是否可以比仅使用SLIME的goto-definition并从那里复制文本更可靠地获取代码?

Sva*_*nte 5

不可以.标准中没有强制要求保存符号中的源代码,因此任何实现都可以选择不执行此操作(这也会影响性能).

我想你可能会更频繁地通过声明获得这种行为optimize (debug 3),但我没有尝试过; 它很可能是依赖于实现的.

更新答案:由于您希望实现与Lisp图像交互的编辑器功能,我要说使用Lisp交互模式(SLIME中的LIM)正是您需要做的.