¿Cómo regresas temprano de una función antes de que termine? Por ejemplo:
(defun my-func ()
"for example."
(unless something (return nil))
; continue as usual...
(+ 42 1))
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)))
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
".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
ocondition-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.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 acondition-case
. Nuevamente, esto es lo que se hace la mayor parte del tiempo, al menos tan a menudo como usarcatch
+throw
. Todo depende de qué comportamiento quieras.fuente
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.)