Respostas:
Temos várias opções disponíveis.
Você pode catch
/ throw
para sair da função.
exemplo:
(defun my-func ()
"thrown error"
(catch 'my-catch
(when t
(throw 'my-catch "always going to throw"))
(+ 42 1)))
Você também pode usar block
e return-from
(embora seja necessário cl-macs
)
exemplo:
(require 'cl-macs)
(defun my-func ()
"block / return-from"
(block my-func
(when t
(return-from my-func))
(+ 42 1)))
Também temos cl-defun
que tem um implícito block
com o mesmo nome que a função, para que possamos fazer o block
estilo com menos.
exemplo:
(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
também está disponível como um alias defun*
definido em cl.el
:
(require 'cl)
(defun* my-func ()
"defun* implicit block"
(when t
(return-from my-func)) ; my-func is an implicit block.
(+ 42 1)))
Além do que o @EmacsFodder abordou, basta gerar um erro.
Isso não ajudará se o código for chamado dentro (dinamicamente, não lexicamente) da extensão das construções de tratamento de erros como ignore-errors
ou condition-case
, mas, caso contrário, é uma boa maneira de sair de uma função. Na verdade, é o que é feito na maioria das vezes.
(defun my-func ()
"..."
(unless something (error "Whoops!"))
; continue as usual...
(+ 42 1))
Se você quiser lidar com o erro você mesmo, poderá colocar o código de chamada (por exemplo, a chamada para algo que chama extremamente my-func
) dentro de a condition-case
. Novamente, é isso que é feito na maioria das vezes, pelo menos com a mesma frequência que o uso de catch
+ throw
. Tudo depende de qual comportamento você deseja.
catch
, unwind-protect
, condition-case
e similares são úteis. Há uma seção inteira do manual Elisp dedicada a saídas não locais . (E não há nada particularmente kludgy sobre qualquer um deles, IMO.)
catch
/throw
é mais idiomático no elisp, pois outras abordagens são implementadas em termos de captura / lançamento. O manual elisp diz: "A maioria das outras versões do Lisp, incluindo Lisp comum, tem várias maneiras de transferir o controle nonsequentially:return
,return-from
, ego
., Por exemplo Emacs Lisp tem apenasthrow
."