假设我全局定义了一个函数:
(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 中工作吗?
你可以尝试函数-Lambda-表达式 http://www.lispworks.com/documentation/HyperSpec/Body/f_fn_lam.htm:
(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
设置),但我不知道它们。请注意,在 REPL 中输入的函数在设置后不会被编译*evaluator-mode*
to :interpret
,因此您可能会遇到更糟糕的性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)