Respuestas:
Tenemos varias opciones disponibles.
Puede catch/ throwpara salir de la función.
ejemplo:
(defun my-func ()
"thrown error"
(catch 'my-catch
(when t
(throw 'my-catch "always going to throw"))
(+ 42 1)))
También puede usar blocky return-from(aunque necesitará requerir cl-macs)
ejemplo:
(require 'cl-macs)
(defun my-func ()
"block / return-from"
(block my-func
(when t
(return-from my-func))
(+ 42 1)))
También tenemos cl-defunun implícito blockcon el mismo nombre que la función, por lo que podemos hacer el blockestilo con menos.
ejemplo:
(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-defuntambién está disponible como un alias defun*que se define cl.elasí:
(require 'cl)
(defun* my-func ()
"defun* implicit block"
(when t
(return-from my-func)) ; my-func is an implicit block.
(+ 42 1)))
Además de lo que cubrió @EmacsFodder, solo genera un error.
Esto no ayudará si el código se llama dentro (dinámicamente, no léxicamente) del alcance de las construcciones de manejo de errores como ignore-errorso condition-case, pero de lo contrario es una buena manera de salir de una función. De hecho, es lo que se hace la mayor parte del tiempo.
(defun my-func ()
"..."
(unless something (error "Whoops!"))
; continue as usual...
(+ 42 1))
Si desea manejar el error usted mismo, puede poner el código de llamada (por ejemplo, la llamada a algo que finalmente llama my-func) dentro de a condition-case. Nuevamente, esto es lo que se hace la mayor parte del tiempo, al menos tan a menudo como usar catch+ throw. Todo depende de qué comportamiento quieras.
catch, unwind-protect, condition-casey similares son útiles. Hay una sección completa del manual de Elisp dedicada a las salidas no locales . (Y no hay nada particularmente grosero en ninguno de ellos, OMI.)
catch/throwes más idiomático en elisp, ya que otros enfoques finalmente se implementan en términos de captura / lanzamiento. El manual elisp dice: "La mayoría de las otras versiones de Lisp, incluyendo Common Lisp, tienen varias maneras de transferir el control de forma no secuencial:return,return-from, ygo., Por ejemplo Emacs Lisp tiene solamentethrow".