Gdy if
jest „jednoręki”, jak nazywają go (to znaczy, że nie zawiera else
oddział), to zazwyczaj łatwiejsze i bardziej idiomatyczne użycie when
i unless
: http://www.cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/mac_whencm_unless.html
Kiedy zadzwonisz pod numer (when pred x y ... z)
, po prostu oceni się x y z
, jeśli pred
jest prawdziwe. unless
zachowuje się podobnie, gdy pred
ma wartość NIL. x y z
może reprezentować dowolną liczbę instrukcji od jednego wzwyż. Zatem:
(when pred (thunk))
jest tak samo jak
(if pred (thunk))
Niektórzy mówią when
i unless
powinny być zawsze stosowane w 'jednorękiego-IFS' ze względu na przejrzystość.
Edytuj: Twoja nić wpadła mi na pomysł. To makro:
(defmacro if/seq (cond then else)
`(if ,cond (progn ,@then) (progn ,@else)))
powinno umożliwić w ten sposób:
(if/seq (find input num) //if this
((setq num NEWNUM) (FUNCT2)) //then execute both of these
((list 'not found)))))
Więc ogólnie format:
(if/seq *condition* (x y ... z) (a b ... c))
W zależności od stanu, ocenia wszystkie podformularze w pierwszy lub drugi , ale zwraca tylko ostatnią.
Lekki offtopic: wydaje się, że zmienna "num" jest zmienną specjalną/dynamiczną (tj. Globalną). Najprawdopodobniej go nie potrzebujesz. –
Który dialekt Lisp jest tym kodem? –