我练习我有以下功能:
(defun ifnot (test e1 e2)
(if test e2 e1))
我被要求描述以下表达式的评估:
(ifnot nil "OK" (error "Unexpected test outcome"))
我不知道问题是关于令牌“nil”还是关于内置错误,你能帮助我吗?
答案 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")