Bagaimana Anda kembali lebih awal dari suatu fungsi sebelum berakhir? Sebagai contoh:
(defun my-func ()
"for example."
(unless something (return nil))
; continue as usual...
(+ 42 1))
Kami memiliki sejumlah opsi yang tersedia.
Anda dapat catch
/ throw
untuk keluar dari fungsi.
contoh:
(defun my-func ()
"thrown error"
(catch 'my-catch
(when t
(throw 'my-catch "always going to throw"))
(+ 42 1)))
Anda juga dapat menggunakan block
dan return-from
(meskipun Anda harus meminta cl-macs
)
contoh:
(require 'cl-macs)
(defun my-func ()
"block / return-from"
(block my-func
(when t
(return-from my-func))
(+ 42 1)))
Kami juga memiliki cl-defun
yang memiliki implisit block
dengan nama yang sama dengan fungsi, sehingga kami dapat melakukan block
gaya dengan lebih sedikit.
contoh:
(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
juga tersedia sebagai alias defun*
yang didefinisikan sebagai cl.el
:
(require 'cl)
(defun* my-func ()
"defun* implicit block"
(when t
(return-from my-func)) ; my-func is an implicit block.
(+ 42 1)))
catch
/throw
itu lebih idiomatis di elisp, karena pendekatan lain pada akhirnya diimplementasikan dalam hal menangkap / melempar. Manual elisp mengatakan: "Kebanyakan versi lain dari Lisp, termasuk Common Lisp, memiliki beberapa cara untuk mentransfer kontrol nonsequentially:return
,return-from
, dango
., Misalnya Emacs Lisp hanya memilikithrow
."Selain apa yang dicakup @EmacsFodder, cukup ajukan kesalahan.
Ini tidak akan membantu jika kode dipanggil di dalam (secara dinamis, bukan secara leksikal) sejauh mana konstruksi penanganan kesalahan seperti
ignore-errors
ataucondition-case
, tetapi sebaliknya itu adalah cara yang baik untuk keluar dari suatu fungsi. Sebenarnya apa yang dilakukan sebagian besar waktu.Jika Anda ingin menangani sendiri kesalahannya maka Anda dapat memasukkan kode panggilan (mis. Panggilan ke sesuatu yang memanggil secara berlebihan
my-func
) di dalam acondition-case
. Sekali lagi, inilah yang paling sering dilakukan, paling tidak sesering menggunakancatch
+throw
. Itu semua tergantung pada perilaku apa yang Anda inginkan.sumber
catch
,unwind-protect
,condition-case
dan sejenisnya yang berguna. Ada seluruh bagian dari manual Elisp yang dikhususkan untuk keluar nonlokal . (Dan tidak ada yang khusus tentang mereka, IMO.)