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 に答える