0

我做一个练习,我有以下功能:

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

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

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

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

4

1 回答 1

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")
于 2013-04-02T04:40:08.363 回答