Comment revenez-vous tôt d'une fonction avant qu'elle ne soit terminée? Par exemple:
(defun my-func ()
"for example."
(unless something (return nil))
; continue as usual...
(+ 42 1))
Nous avons un certain nombre d'options disponibles.
Vous pouvez catch
/ throw
pour quitter la fonction.
exemple:
(defun my-func ()
"thrown error"
(catch 'my-catch
(when t
(throw 'my-catch "always going to throw"))
(+ 42 1)))
Vous pouvez également utiliser block
et return-from
(même si vous en aurez besoin cl-macs
)
exemple:
(require 'cl-macs)
(defun my-func ()
"block / return-from"
(block my-func
(when t
(return-from my-func))
(+ 42 1)))
Nous avons aussi cl-defun
qui a un implicite block
avec le même nom que la fonction, donc nous pouvons faire le block
style avec moins.
exemple:
(require 'cl-macs)
(cl-defun my-func ()
"cl-defun implicit block"
(when t
(return-from my-func)) ; my-func is an implicit block.
(+ 42 1)))
cl-defun
est également disponible sous la forme d'un alias defun*
défini comme suit cl.el
:
(require 'cl)
(defun* my-func ()
"defun* implicit block"
(when t
(return-from my-func)) ; my-func is an implicit block.
(+ 42 1)))
catch
/throw
est plus idiomatique dans elisp, car d'autres approches sont finalement implémentées en termes de catch / throw. Le manuel dit elisp: « La plupart des autres versions de Lisp, y compris Common Lisp, ont plusieurs façons de transférer le contrôle non séquentielle:return
,return-from
etgo
., Par exemple Emacs Lisp a seulementthrow
. »En plus de ce que couvrait @EmacsFodder, il suffit de soulever une erreur.
Cela n'aidera pas si le code est appelé dans (dynamiquement, pas lexicalement) l'étendue des constructions de gestion des erreurs telles que
ignore-errors
oucondition-case
, mais sinon c'est une bonne façon de quitter une fonction. C'est en fait ce qui se fait la plupart du temps.Si vous voulez gérer l'erreur vous-même, vous pouvez mettre le code d'appel (par exemple, l'appel à quelque chose qui appelle finalement
my-func
) à l'intérieur de acondition-case
. Encore une fois, c'est ce qui se fait la plupart du temps, au moins aussi souvent que d'utilisercatch
+throw
. Tout dépend du comportement que vous souhaitez.la source
catch
,unwind-protect
,condition-case
etc. sont utiles. Il existe toute une section du manuel Elisp consacrée aux sorties non locales . (Et il n'y a rien de particulièrement maladroit chez aucun d'entre eux, OMI.)