私は次の機能を持っている演習です:
(defun ifnot (test e1 e2)
(if test e2 e1))
次の式の評価を説明するよう求められます。
(ifnot nil "OK" (error "Unexpected test outcome"))
問題がトークン「nil」に関するものなのか、組み込みエラーに関するものなのかわかりません。助けてもらえますか?
私は次の機能を持っている演習です:
(defun ifnot (test e1 e2)
(if test e2 e1))
次の式の評価を説明するよう求められます。
(ifnot nil "OK" (error "Unexpected test outcome"))
問題がトークン「nil」に関するものなのか、組み込みエラーに関するものなのかわかりません。助けてもらえますか?
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")