【发布时间】:2014-06-25 21:24:07
【问题描述】:
我正在学习 Lisp。现在我正在尝试创建一个函数,该函数将一些有效的 Lisp 形式作为参数,并返回一个在调用时执行 Lisp 形式的函数。例如:
(defun fn (name action)
(setf (symbol-function name)
#'(lambda () action)))
当我通过说(+ 4 5 6) 时,该函数会以特定名称创建,并在调用时返回总和。
(fn 'add (+ 4 5 6))
(add) ==> 15
但如果我调用(fn 'error (assert (= 2 3)),则会抛出错误(= 2 3) must evaluate to a non-NIL value.,并且不会创建名为error 的函数。
当作为函数参数传递时,如何停止对 assert 的评估?
【问题讨论】:
-
注意
error是一个Common Lisp函数,你不应该重新定义它。 -
@PauloMadeira 这只是一个示例代码,用于理解和试验这些概念。
-
我知道,但我觉得这个评论是必要的,至少对后代来说是这样。如果您重新定义
error,即使只是为了进行实验,您应该期望与您的 Common Lisp 实现的其余交互非常不稳定,至少可以这么说。您最好尝试使用不命名 CL 函数的符号。除非您对可能发生的事情感到好奇,否则这可能是一种教学探索。 -
谢谢@PauloMadeira 我明白你的意思了。
标签: lisp common-lisp