Risposte:
Abbiamo un numero di opzioni disponibili.
È possibile catch
/ throw
per uscire dalla funzione.
esempio:
(defun my-func ()
"thrown error"
(catch 'my-catch
(when t
(throw 'my-catch "always going to throw"))
(+ 42 1)))
Puoi anche usare block
e return-from
(anche se dovrai richiederlo cl-macs
)
esempio:
(require 'cl-macs)
(defun my-func ()
"block / return-from"
(block my-func
(when t
(return-from my-func))
(+ 42 1)))
Abbiamo anche cl-defun
un implicito block
con lo stesso nome della funzione, quindi possiamo fare lo block
stile con meno.
esempio:
(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
è anche disponibile come alias defun*
che è definito in questo cl.el
modo:
(require 'cl)
(defun* my-func ()
"defun* implicit block"
(when t
(return-from my-func)) ; my-func is an implicit block.
(+ 42 1)))
Oltre a ciò che ha riguardato @EmacsFodder, basta generare un errore.
Ciò non sarà d'aiuto se il codice viene chiamato all'interno (in modo dinamico, non lessicale) dell'estensione dei costrutti di gestione degli errori come ignore-errors
o condition-case
, ma per il resto è un ottimo modo per uscire da una funzione. In realtà è ciò che viene fatto la maggior parte delle volte.
(defun my-func ()
"..."
(unless something (error "Whoops!"))
; continue as usual...
(+ 42 1))
Se si desidera gestire da soli l'errore, è possibile inserire il codice chiamante (ad es. La chiamata a qualcosa che chiama in via definitiva my-func
) all'interno di a condition-case
. Ancora una volta, questo è ciò che viene fatto la maggior parte delle volte, almeno tutte le volte che si utilizza catch
+ throw
. Tutto dipende dal comportamento che desideri.
catch
, unwind-protect
, condition-case
e simili sono utili. C'è un'intera sezione del manuale Elisp dedicata alle uscite non locali . (E non c'è niente di particolarmente kludgy su uno di essi, IMO.)
catch
/throw
è più idiomatico in elisp, poiché altri approcci vengono infine implementati in termini di cattura / lancio. Il manuale elisp dice: "La maggior parte delle altre versioni di Lisp, tra cui Common Lisp, hanno diversi modi di trasferire il controllo non sequenziale:return
,return-from
, ego
., Per esempio Emacs Lisp ha solothrow
."