Jak wrócić wcześniej z funkcji przed jej zakończeniem? Na przykład:
(defun my-func ()
"for example."
(unless something (return nil))
; continue as usual...
(+ 42 1))
Mamy wiele dostępnych opcji.
Możesz catch
/ throw
wyjść z funkcji.
przykład:
(defun my-func ()
"thrown error"
(catch 'my-catch
(when t
(throw 'my-catch "always going to throw"))
(+ 42 1)))
Możesz także użyć block
i return-from
(chociaż będziesz musiał wymagać cl-macs
)
przykład:
(require 'cl-macs)
(defun my-func ()
"block / return-from"
(block my-func
(when t
(return-from my-func))
(+ 42 1)))
Mamy też cl-defun
coś, co ma domyślną block
nazwę o tej samej nazwie co funkcja, więc możemy wykonać block
styl za mniej.
przykład:
(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
jest również dostępny jako alias defun*
zdefiniowany w następujący cl.el
sposób:
(require 'cl)
(defun* my-func ()
"defun* implicit block"
(when t
(return-from my-func)) ; my-func is an implicit block.
(+ 42 1)))
catch
/throw
jest bardziej idiomatyczny w elisp, ponieważ inne podejścia są ostatecznie implementowane w kategoriach catch / throw. Elisp instrukcja mówi: „Większość innych wersjach Lisp, w tym Common Lisp, mają kilka sposobów przekazywania sterowania nonsequentially:return
,return-from
, igo
., Na przykład Emacs Lisp ma tylkothrow
”.Oprócz tego, co obejmuje @EmacsFodder, po prostu zgłoś błąd.
Nie pomoże to, jeśli kod zostanie wywołany (dynamicznie, nie leksykalnie) w zakresie konstrukcji obsługujących błędy, takich jak
ignore-errors
lubcondition-case
, ale w przeciwnym razie jest to dobry sposób na wyjście z funkcji. W rzeczywistości tak się dzieje przez większość czasu.Jeśli chcesz sam poradzić sobie z błędem, możesz umieścić kod wywołujący (np. Wywołanie czegoś, co ostatecznie wywołuje
my-func
) wewnątrzcondition-case
. Znowu tak się dzieje przez większość czasu, przynajmniej tak często, jak przy użyciucatch
+throw
. Wszystko zależy od tego, jakie zachowanie chcesz.źródło
catch
,unwind-protect
,condition-case
i tym podobne są użyteczne. Istnieje cała sekcja podręcznika Elisp poświęcona nielokalnym wyjściom . (I w żadnym z nich nie ma nic szczególnie nieprzyzwoitego, IMO.)