我用
sbcl+emacs+slime
。C-c C-c
编译,但我已经删除了它。我尝试使用
function-lambda-expression
,但我得到了这个:
(function-lambda-expression #'b)
T
B
我希望有人能给我一些帮助。提前非常感谢!
谢谢弗谢沃洛德。 如果函数在
repl
中定义,我可以使用 (descri #'function-name)
获取如何定义该函数,但是如果我通过 C-c C-c
定义它,我只会得到 source file
根据您的调试和优化设置,您也许可以通过
describe
: 获取它
CL-USER> (defun f (a) (print a))
F
CL-USER> (describe #'f)
#<FUNCTION F>
[compiled function]
Lambda-list: (A)
Derived type: (FUNCTION (T) (VALUES T &OPTIONAL))
Source form:
(SB-INT:NAMED-LAMBDA F
(A)
(BLOCK F (PRINT A)))
您可以在
Source form
部分看到定义。
正如已经指出的,
(describe #'b)
可用于打印函数的描述,包括其源形式,(function-lambda-expression #'b)
可用于直接将定义检索为值。
但是,要使这些函数正常工作,必须保存
b
的源形式。对于 SBCL,当 debug
策略设置为 2 或更高,或者当 sb-c:store-source-form
设置为 3 时,肯定会发生这种情况。当 sb-c:store-source-form
设置为 1 时,有时会保存源表单,有时会保存源表单不是。值得注意的是,默认值(至少在我的 SBCL 2.5.0 实例中)是 (debug 1)
和 (sb-c:store-source-form 1)
,这意味着源表单有时会保存,有时不会。
因此,如果您想保证可以检查任何函数的源形式,您可以使用以下任一顶级声明:
(declaim (optimize sb-c:store-source-form))
(declaim (optimize (debug 2))
或者,对于单个函数:
(defun b ()
(declare (optimize sb-c:store-source-form))
(format t "hello from b~%"))
然后就可以查看源代码了:
(describe #'b)
(function-lambda-expression #'b)
备注:
(optimize (debug n))
的效果请参见https://www.sbcl.org/manual/#Debugger-Policy-Control。(sb-ext:describe-compiler-policy)
查看当前活动的声明。(declare (optimize x))
只是 (declare (optimize (x 3))
的缩写。sb-c:store-source-form
,但源代码中的注释解释了: 如果编译到文件,我们仅在 STORE-SOURCE 质量值为 3 时存储源。如果要记住,任何非零值即可。