C'est une question simple, mais je ne pouvais pas trouver une réponse en googling:
Comment quittez-vous une fonction à tout point d'exécution arbitraire, si une condition n'est pas remplie. Par exemple (j'utilise "(sortie)" comme substitut ici): p>
4 Réponses :
Mettez un bloc autour du corps et revenez-en:
(require 'cl-macs) (defun foo () (block foo (if (/= a1 a2) (return-from foo) reture-value))))
Une fonction renvoie la valeur du dernier formulaire évalué. Si vous ne vous souciez pas de la valeur, alors par exemple: p> dans cet exemple trivial, ceux-ci seraient également ÉQUIVALENT: P> nil code> serait un candidat probable. Dans ce cas, la fonction renvoie la valeur de la fonction
si code>.
(defun foo ()
(if (not (/= a1 a2))
"return-value"))
(defun foo ()
(when (not (/= a1 a2))
"return-value"))
: Ce n'est pas ma question. Désolé, mon exemple précédent est trompeur. Je l'ai changé.
Ah ok. Dans la majorité des situations, vous devriez être capable de structurer votre code afin d'éviter le besoin de sorties non locales, mais j'ai ajouté une autre réponse avec l'approche Standard Elisp pour le faire.
dans elisp, vous pouvez utiliser attraper code> et
lancer code>
CL code> et
retour-de code> .
(defun foo ()
(catch 'my-tag
(when (not (/= a1 a2))
(throw 'my-tag "non-local exit value"))
"normal exit value"))
Il suffit d'utiliser Par exemple: P> défunt * code> au lieu de
défunt code> (livré avec
cl code> package). Cette macro agit déjà comme le
de LISP Common Lisp code> (enveloppe le corps de la fonction dans un bloc de try-catch et des alias
retour-de code> à
lancer code> etc. .).
(require 'cl)
(defun* get-out-early ()
"Get out early from this silly example."
(when (not (boundp some-unbound-symbol))
(return-from get-out-early))
;;
;; Get on with the func...
;;
(do-such-and-such with-some-stuff))