11
votes

Comment sortir d'une fonction à tout point arbitraire, dans Elisp

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): xxx


0 commentaires

4 Réponses :


10
votes

Mettez un bloc autour du corps et revenez-en:

(require 'cl-macs)
(defun foo ()
  (block foo
    (if (/= a1 a2)
        (return-from foo)
        reture-value))))


0 commentaires

3
votes

Une fonction renvoie la valeur du dernier formulaire évalué. Si vous ne vous souciez pas de la valeur, alors nil code> serait un candidat probable. Dans ce cas, la fonction renvoie la valeur de la fonction si code>.

par exemple: p> xxx pré>

dans cet exemple trivial, ceux-ci seraient également ÉQUIVALENT: P>

(defun foo ()
  (if (not (/= a1 a2))
      "return-value"))

(defun foo ()
  (when (not (/= a1 a2))
    "return-value"))


2 commentaires

: 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.



13
votes

dans elisp, vous pouvez utiliser attraper code> et lancer code> Au lieu du bloc 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"))


0 commentaires

9
votes

Il suffit d'utiliser 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. .).

Par exemple: P>

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


0 commentaires