Lorsque votre if
est « manchot », comme ils l'appellent (qui est, il ne contient pas de branche else
), il est généralement plus facile et plus idiomatiques à utiliser when
et unless
: http://www.cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/mac_whencm_unless.html
Lorsque vous appelez (when pred x y ... z)
, il va juste évaluer x y z
séquentiellement si pred
est vrai. unless
se comporte de manière similaire lorsque pred
est NIL. x y z
peut représenter un nombre quelconque d'instructions à partir d'une seule. Ainsi:
(when pred (thunk))
est la même chose que
(if pred (thunk))
Certaines personnes disent when
et unless
doivent toujours être utilisés pour « manchot ifs » en raison de la clarté.
Editer: Votre fil m'a donné une idée. Cette macro:
(defmacro if/seq (cond then else)
`(if ,cond (progn ,@then) (progn ,@else)))
devrait permettre ceci:
(if/seq (find input num) //if this
((setq num NEWNUM) (FUNCT2)) //then execute both of these
((list 'not found)))))
Ainsi, le format général est:
(if/seq *condition* (x y ... z) (a b ... c))
En fonction de l'état, il évalue toutes les sous-formulaires dans le premier ou le deuxième , mais ne renvoie que le dernier.
Léger hors-sujet: il semble que la variable 'num' soit une variable spéciale/dynamique (c'est-à-dire globale). Très probablement, vous n'en avez pas besoin. –
Quel dialecte Lisp est ce code écrit? –