假设我全局定义一个函数:
(defun x (y) (1+ y)) ;; Edit: my first example was too complicated
是否可以将函数x“强制”为如下列表:
(x (y) (1+ y))
提前致谢!
PS - @ Danlei的例子在Clozure CL中有一个特殊的标志,但是有谁知道如何让FUNCTION-LAMBDA-EXPRESSION在SBCL中运行?
答案 0 :(得分:8)
您可以尝试FUNCTION-LAMBDA-EXPRESSION:
(function-lambda-expression #'foo)
但它不能保证工作(“......实现可以自由地返回``nil,true,nil''在所有情况下......”)。
例如在CCL中:
CL-USER> (setq ccl:*save-definitions* t)
T
CL-USER> (defun x (x y) (+ x y))
X
CL-USER> (function-lambda-expression #'x)
(LAMBDA (X Y) (DECLARE (CCL::GLOBAL-FUNCTION-NAME X)) (BLOCK X (+ X Y)))
NIL
X
在SBCL中,您可以尝试(setq sb-ext:*evaluator-mode* :interpret)
(未经测试)。也许还有其他方法可以在SBCL中实现这一点(你可能会寻找*save-definitions*
的模拟,或者甚至尝试不同的OPTIMIZE
设置),但我不知道它们。请注意,在将*evaluator-mode*
设置为:interpret
后,将不会编译在REPL中输入的函数,因此您可能会遇到性能下降的问题。
答案 1 :(得分:2)
在Common Lisp中,可能能够使用function-lambda-expression
(参见HyperSpec)或某些实现uncompile-function
恢复函数的定义。
答案 2 :(得分:0)
当我花时间在一个项目上进行重要的函数操作时,最容易做到这一点:
(defclass node ()
(list-form
compiled-obj))
首先将分配由'(lambda foo(x)bar)组成的列表表单,然后我将编译Foo并将其分配给compiled-ojb插槽。