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

Common lisp 如何从Common Lisp中的函数符号中获取函数表达式?,common-lisp,Common Lisp,我将展示我希望从Common Lisp中获得的、已经在Elisp中运行的东西: (德芬广场(x) (*x)) (符号功能“方形”) ;; => (λ(x)(*x x)) 因此,只要知道符号正方形,我就想找回它的整个身体。 我看过CL的: (函数lambda表达式#'平方) ;; => (SB-INT:NAMED-LAMBDA SQUARE) (十) (方形方块(*X))) 无 广场 返回的结果接近于我需要的结果,但它只是有时有效。 大多数时候,我会: (函数lambda表达式列表) ;; =

我将展示我希望从Common Lisp中获得的、已经在Elisp中运行的东西:

(德芬广场(x)
(*x))
(符号功能“方形”)
;; => (λ(x)(*x x))
因此,只要知道符号
正方形
,我就想找回它的整个身体。 我看过CL的:

(函数lambda表达式#'平方)
;; =>
(SB-INT:NAMED-LAMBDA SQUARE)
(十)
(方形方块(*X)))
无
广场
返回的结果接近于我需要的结果,但它只是有时有效。 大多数时候,我会:

(函数lambda表达式列表)
;; =>
无
T
列表
是否有更可靠的功能可以做到这一点?我知道,
swank backend:arglist
非常有用 很擅长检索参数,但我找不到用于该主体的检索器

更新 在纯lisp中似乎不可能得到一般的解决方案。这在黏液中可以做到吗? 假设我一直在运行SLIME,所有的代码都是通过SLIME加载的。代码可以被修改吗
比使用SLIME的goto定义并从中复制文本更可靠?

否。标准不强制在符号处保存源代码,因此任何实现都可能选择不这样做(这也会影响性能)

我想,你可能会更经常地通过发表
optimize(debug 3)
来获得这种行为,但我没有尝试过;它很可能依赖于实现


更新答案:既然您想实现与Lisp映像交互的编辑器功能,我想说的是,使用Lisp交互模式(SLIME中的LIM)正是您需要做的。

可能是因为系统/核心功能,如
#列表
,在构建映像时已为提高速度而编译?也许如果你自己引导SBCL,你可以制作一个更慢、信息更多的。或者,您也可以查看sode的来源:

(describe #'list)

#<FUNCTION LIST>
  [compiled function]

Lambda-list: (&REST ARGS)
Declared type: (FUNCTION * (VALUES LIST &OPTIONAL))
Derived type: (FUNCTION (&REST T) (VALUES LIST &OPTIONAL))
Documentation:
  Return constructs and returns a list of its arguments.
Known attributes: flushable, unsafely-flushable, movable
Source file: SYS:SRC;CODE;LIST.LISP
(描述#'列表)
#
[编译函数]
Lambda列表:(&REST参数)
声明的类型:(函数*(值列表和可选))
派生类型:(函数和REST T)(值列表和可选)
文档:
Return构造并返回其参数列表。
已知属性:可冲洗、不安全冲洗、可移动
源文件:SYS:SRC;代码;LIST.LISP
最后一行是正确的,因为在下面你可以找到定义

注意
descripe
function lambda expression
的行为依赖于实现。例如,在CLISP中,输出完全不同。

(函数lambda表达式列表)
此处尝试检索内置函数的代码。并非每个内置函数都需要Lisp代码作为其实现

我还没有尝试过,但也许你可以自己构建SBCL,这样它就可以记录源代码并保存在映像中


对于SBCL的标准映像,我不希望它包含源代码。

谢谢,我该如何优化声明?除了性能影响(内存?)之外,它还有操作影响:可能捕获的词法环境。您还可以通过其他实现获得更可靠的结果。例如,CLISP可能会保存更多有关定义的数据。(这只是一个猜测,基于最近的一个问题,)你到底想做什么?我正在尝试为CL实现一个在点处展开的操作:在点处调用函数,并将参数替换到函数体中。我已经为Elisp和Clojure准备了一个。你将如何处理闭包?你在elisp和clojure如何处理他们?你为什么要在黏液下做这件事?听起来你好像在尝试某种形式的内联,但在某种程度上,你没有足够的信息来知道你是否真的可以执行它。内联是交互式的,纯粹是为了加快编辑速度。如果成功了,就成功了。如果不行-哦,我仍然可以手动操作。