Réponses:
Nous avons un certain nombre d'options disponibles.
Vous pouvez catch/ throwpour 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 blocket 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-defunqui a un implicite blockavec le même nom que la fonction, donc nous pouvons faire le blockstyle 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-defunest é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-errorsou 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-caseetc. 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/throwest 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-frometgo., Par exemple Emacs Lisp a seulementthrow. »