5

假设我在全局范围内定义了一个函数:

(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 中工作吗?

4

3 回答 3

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*请注意,在 REPL 中输入的函数在设置为后不会被编译:interpret,因此您可能会遇到更差的性能。

于 2011-04-30T21:49:55.203 回答
2

在 Common Lisp 中,您可能能够使用function-lambda-expression(参见HyperSpec)或在某些实现中恢复函数的定义uncompile-function

于 2011-04-30T21:49:29.427 回答
0

当我花时间在一个项目上进行重要的功能操作时,做这种事情是最容易的:

(defclass node ()
  (list-form
   compiled-obj))

首先将分配由 '(lambda foo (x) bar) 组成的列表形式,然后我将编译 Foo 并将其分配给已编译的 ojb 插槽。

于 2011-05-03T00:31:48.833 回答