假设我在全球范围定义一个函数:在LISP中可以访问函数的表单吗?
(defun x (y) (1+ y)) ;; Edit: my first example was too complicated
是否有可能“强迫”的函数x成一个列表,如:
(x (y) (1+ y))
提前感谢!
PS - @丹蕾的例子Clozure CL可与一个特殊的标志,但是没有人知道如何获得FUNCTION-LAMBDA表达对SBCL工作?
假设我在全球范围定义一个函数:在LISP中可以访问函数的表单吗?
(defun x (y) (1+ y)) ;; Edit: my first example was too complicated
是否有可能“强迫”的函数x成一个列表,如:
(x (y) (1+ y))
提前感谢!
PS - @丹蕾的例子Clozure CL可与一个特殊的标志,但是没有人知道如何获得FUNCTION-LAMBDA表达对SBCL工作?
你可以尝试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中输入的函数,因此您可能会遇到更差的性能。
我发现我无法获得FUNCTION-LAMBDA-EXPRESSION在SBCL中工作的原因,显然这是一个优化步骤,不保存函数的sexp副本不是内联的。请参阅https://bugs.launchpad.net/sbcl/+bug/560977 – 2011-05-01 00:38:38
@ ReubenPeter-Paul作为一个简短的更新,[相关的问题](http://stackoverflow.com/q/18650988/1281433)最近被问到,看来SBCL的更新版本(请参阅[本答案](http://stackoverflow.com/a/18652612/1281433)上的评论)具有不同的行为。 – 2013-09-06 11:38:02
Common Lisp中,你可能能够恢复使用function-lambda-expression
一个函数的定义(见HyperSpec),或在一些实现uncompile-function
。
当我花时间在一个项目做显著功能的操作,这是最容易做这样的事情:
(defclass node()
(list-form
compiled-obj))
首先以列表形式包括“(拉姆达FOO(X)条)将被分配,然后我将编译Foo并将其分配到编译的ojb插槽。
您的定义有缺陷:x是函数,不能与+ – bandi 2011-04-30 21:50:35
一起使用bandi:'x'只是一个符号。在这种情况下会涉及一个变量。 (请参阅下面的danlei示例。) – Ken 2011-04-30 21:54:52
我为我的答案添加了一个可能的(未经测试的)SBCL解决方案。 – danlei 2011-04-30 23:06:16