Réponses:
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)))
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
ou condition-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.
(defun my-func ()
"..."
(unless something (error "Whoops!"))
; continue as usual...
(+ 42 1))
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 a condition-case
. Encore une fois, c'est ce qui se fait la plupart du temps, au moins aussi souvent que d'utiliser catch
+ throw
. Tout dépend du comportement que vous souhaitez.
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.)
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
. »