Когда ваш if
«однорукий», как его называют (то есть он не содержит ветки else
), обычно проще и более идиоматично использовать when
и unless
: http://www.cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/mac_whencm_unless.html
Когда вы звоните (when pred x y ... z)
, он просто оценит x y z
последовательно, если pred
- правда.unless
ведет себя аналогично, когда pred
равен NIL.x y z
может представлять любое количество операторов от одного вверх.Таким образом:
(when pred (thunk))
- это то же самое, что и
(if pred (thunk))
Некоторые люди говорят, что when
и unless
всегда следует использовать для «однорукого действия» из-за ясности.
Редактировать: Ваша тема дала мне идею.Этот макрос:
(defmacro if/seq (cond then else)
`(if ,cond (progn ,@then) (progn ,@else)))
должен включить это:
(if/seq (find input num) //if this
((setq num NEWNUM) (FUNCT2)) //then execute both of these
((list 'not found)))))
Таким образом, общий формат:
(if/seq *condition* (x y ... z) (a b ... c))
В зависимости от условия он оценивает всеподчиняется в первом или втором, но возвращает только последнее.