2013-04-01 2 views
0

I упражнение У меня есть следующие функции:Wierd напечатал функцию

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

Я попросил, чтобы описать оценку следующего выражения:

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

Я не если проблема знать о знаке «ноль» или о встроенной ошибке, можете ли вы мне помочь?

+1

Какая проблема? Упражнение касается того, когда и оцениваются ли аргументы функции. – sepp2k

+0

Упражнение говорит, что оценка вызова функции (ifnot nil «OK» ...) приведет к ошибке, мне интересно, какая ошибка будет – user2233777

+0

Неожиданный результат теста? '(ifnot noil ...)' _should_ работает как '(if t ...)' Делает это? –

ответ

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")