私は次の機能を持っている演習です:
(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")