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

Reu*_*aul 5 lisp clisp functional-programming sbcl common-lisp

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

(defun x (y) (1+ y)) ;; Edit: my first example was too complicated
Run Code Online (Sandbox Code Playgroud)

是否有可能将函数x"强制"为一个列表,如:

(x (y) (1+ y))
Run Code Online (Sandbox Code Playgroud)

提前致谢!

PS - @ Danlei的例子在Clozure CL中有一个特殊标志,但是有谁知道如何让FUNCTION-LAMBDA-EXPRESSION在SBCL中运行?

dan*_*lei 8

您可以尝试FUNCTION-LAMBDA-EXPRESSION:

(function-lambda-expression #'foo)
Run Code Online (Sandbox Code Playgroud)

但它并不能保证工作("......在所有情况下......实现都可以自由返回``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
Run Code Online (Sandbox Code Playgroud)

在SBCL中,您可以尝试(setq sb-ext:*evaluator-mode* :interpret)(未经测试).也许还有其他方法可以在SBCL中实现这一点(你可能会寻找模拟*save-definitions*甚至尝试不同的OPTIMIZE设置),但我不知道它们.要注意的是在REPL中输入功能将不会设置之后被编译*evaluator-mode*:interpret,所以你可能会遇到性能差.