2011-04-30 47 views
5

假设我在全球范围定义一个函数:在LISP中可以访问函数的表单吗?

(defun x (y) (1+ y)) ;; Edit: my first example was too complicated 

是否有可能“强迫”的函数x成一个列表,如:

(x (y) (1+ y)) 

提前感谢!

PS - @丹蕾的例子Clozure CL可与一个特殊的标志,但是没有人知道如何获得FUNCTION-LAMBDA表达对SBCL工作?

+0

您的定义有缺陷:x是函数,不能与+ – bandi 2011-04-30 21:50:35

+0

一起使用bandi:'x'只是一个符号。在这种情况下会涉及一个变量。 (请参阅下面的danlei示例。) – Ken 2011-04-30 21:54:52

+0

我为我的答案添加了一个可能的(未经测试的)SBCL解决方案。 – danlei 2011-04-30 23:06:16

回答

8

你可以尝试FUNCTION-LAMBDA-EXPRESSION

(function-lambda-expression #'foo) 

但它不能保证工作(“......实现可以自由在所有情况下返回``零,真实,无'......”)。

例如,在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

我发现我无法获得FUNCTION-LAMBDA-EXPRESSION在SBCL中工作的原因,显然这是一个优化步骤,不保存函数的sexp副本不是内联的。请参阅https://bugs.launchpad.net/sbcl/+bug/560977 – 2011-05-01 00:38:38

+0

@ ReubenPeter-Paul作为一个简短的更新,[相关的问题](http://stackoverflow.com/q/18650988/1281433)最近被问到,看来SBCL的更新版本(请参阅[本答案](http://stackoverflow.com/a/18652612/1281433)上的评论)具有不同的行为。 – 2013-09-06 11:38:02

2

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

0

当我花时间在一个项目做显著功能的操作,这是最容易做这样的事情:

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

首先以列表形式包括“(拉姆达FOO(X)条)将被分配,然后我将编译Foo并将其分配到编译的ojb插槽。

相关问题