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中运行?
您可以尝试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,所以你可能会遇到性能差.