在LISP中是否可以访问函数的形式?

时间:2011-04-30 21:20:43

标签: functional-programming lisp common-lisp sbcl clisp

假设我全局定义一个函数:

(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中运行?

3 个答案:

答案 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插槽。