奇怪的打字功能

时间:2013-04-01 21:58:01

标签: lisp

我练习我有以下功能:

(defun ifnot (test e1 e2)
   (if test e2 e1))

我被要求描述以下表达式的评估:

(ifnot nil "OK" (error "Unexpected test outcome"))

我不知道问题是关于令牌“nil”还是关于内置错误,你能帮助我吗?

1 个答案:

答案 0 :(得分:2)

正如你所写,

ifnot是一个功能。在计算函数时,将在计算函数体之前评估所有参数。虽然您的示例中遗漏了e2的值,但仍会评估e2,因此仍会调用error。如果它是一个宏,那么它会像你想要的那样工作:

(defmacro ifnot (test e1 e2)
  `(if ,test ,e2 ,e1))

这样,代码

(ifnot nil "OK" (error "Unexpected test outcome"))
在编译时将

替换为

(if nil (error "Unexpected test outcome") "OK")