【发布时间】:2015-03-20 09:53:58
【问题描述】:
我将展示我想要的 Common Lisp 中已经在 Elisp 中工作的东西:
(defun square (x)
(* x x))
(symbol-function 'square)
;; => (lambda (x) (* x x))
所以只要知道符号square,我就想找回它的整个身体。
我看过 CL 的:
(function-lambda-expression #'square)
;; =>
(SB-INT:NAMED-LAMBDA SQUARE
(X)
(BLOCK SQUARE (* X X)))
NIL
SQUARE
返回结果接近我需要的结果,但它只是有时有效。 大多数时候,我得到:
(function-lambda-expression #'list)
;; =>
NIL
T
LIST
有没有更可靠的功能可以做到这一点?我知道swank-backend:arglist 这非常
擅长检索论据,但我在那儿找不到正文的检索器。
更新
在普通的 lisp 中似乎不可能实现通用解决方案。这可以在 SLIME 中完成吗? 假设我一直在运行 SLIME,并且所有代码都是通过那里加载的。代码可以 比仅仅使用 SLIME 的 goto-definition 并从那里复制文本更可靠吗?
【问题讨论】:
-
您还可以通过其他实现获得更可靠的结果。例如,CLISP 可能会保存更多关于定义的数据。 (这只是一个猜测,基于最近的一个问题,Strange behavior in Common Lisp。)
-
你真正想做什么?
-
我正在尝试为 CL 实现一个 flatten-at-point 操作:在 point 处进行函数调用并将参数替换为函数体。我已经为 Elisp 和 Clojure 准备了一个。
-
你将如何处理闭包?您如何在 elisp 和 clojure 中处理它们?你为什么要在 SLIME 下做这件事?听起来您正在尝试某种形式的内联,但您没有足够的信息来知道您是否可以实际执行它。
-
关闭 Elisp 的工作。内联是交互式的,纯粹是为了加快编辑速度。如果它有效,它就有效。如果它没有 - 哦,好吧,我仍然可以手动完成。
标签: common-lisp