Respuestas:
Tenemos varias opciones disponibles.
Puede catch
/ throw
para 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 block
y 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-defun
un implícito block
con el mismo nombre que la función, por lo que podemos hacer el block
estilo 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-defun
también está disponible como un alias defun*
que se define cl.el
así:
(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-errors
o 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-case
y 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
/throw
es 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
".