Risposte:
Abbiamo un numero di opzioni disponibili.
È possibile catch/ throwper 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 blocke 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-defunun implicito blockcon lo stesso nome della funzione, quindi possiamo fare lo blockstile 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.elmodo:
(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-errorso 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-casee 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."