假设我在全局范围内定义了一个函数:
(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 中工作吗?
假设我在全局范围内定义了一个函数:
(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 中工作吗?
您可以尝试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*
请注意,在 REPL 中输入的函数在设置为后不会被编译:interpret
,因此您可能会遇到更差的性能。
在 Common Lisp 中,您可能能够使用function-lambda-expression
(参见HyperSpec)或在某些实现中恢复函数的定义uncompile-function
。
当我花时间在一个项目上进行重要的功能操作时,做这种事情是最容易的:
(defclass node ()
(list-form
compiled-obj))
首先将分配由 '(lambda foo (x) bar) 组成的列表形式,然后我将编译 Foo 并将其分配给已编译的 ojb 插槽。