คุณจะกลับก่อนจากฟังก์ชั่นก่อนที่มันจะจบลงอย่างไร ตัวอย่างเช่น:
(defun my-func ()
"for example."
(unless something (return nil))
; continue as usual...
(+ 42 1))
คุณจะกลับก่อนจากฟังก์ชั่นก่อนที่มันจะจบลงอย่างไร ตัวอย่างเช่น:
(defun my-func ()
"for example."
(unless something (return nil))
; continue as usual...
(+ 42 1))
คำตอบ:
เรามีตัวเลือกมากมายให้เลือก
คุณสามารถcatch
/ throw
เพื่อออกจากฟังก์ชั่น
ตัวอย่าง:
(defun my-func ()
"thrown error"
(catch 'my-catch
(when t
(throw 'my-catch "always going to throw"))
(+ 42 1)))
คุณยังสามารถใช้block
และreturn-from
(แม้ว่าคุณจะต้องมีcl-macs
)
ตัวอย่าง:
(require 'cl-macs)
(defun my-func ()
"block / return-from"
(block my-func
(when t
(return-from my-func))
(+ 42 1)))
นอกจากนี้เรายังมีcl-defun
สิ่งที่มีความหมายโดยนัยที่block
มีชื่อเดียวกับฟังก์ชั่นเพื่อให้เราสามารถทำblock
รูปแบบที่มีน้อย
ตัวอย่าง:
(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
ยังมีอยู่ในนามแฝงdefun*
ที่กำหนดไว้ในcl.el
:
(require 'cl)
(defun* my-func ()
"defun* implicit block"
(when t
(return-from my-func)) ; my-func is an implicit block.
(+ 42 1)))
นอกเหนือจากสิ่งที่ @EmacsFodder ครอบคลุมเพียงแค่เพิ่มข้อผิดพลาด
สิ่งนี้จะไม่ช่วยถ้ารหัสถูกเรียกใช้ภายใน (แบบไดนามิกไม่เกี่ยวกับคำศัพท์) ขอบเขตของโครงสร้างการจัดการข้อผิดพลาดเช่นignore-errors
หรือcondition-case
แต่อย่างอื่นมันเป็นวิธีที่ดีในการออกจากฟังก์ชัน ในความเป็นจริงสิ่งที่ทำส่วนใหญ่เวลา
(defun my-func ()
"..."
(unless something (error "Whoops!"))
; continue as usual...
(+ 42 1))
หากคุณต้องการที่จะจัดการกับข้อผิดพลาดด้วยตัวคุณเองแล้วคุณสามารถใส่รหัสโทร (เช่นการเรียกร้องให้สิ่งที่โทร ulimately my-func
) condition-case
ภายใน อีกครั้งนี้เป็นสิ่งที่จะทำมากที่สุดของเวลาอย่างน้อยได้บ่อยเท่าที่ใช้+catch
throw
ทุกอย่างขึ้นอยู่กับพฤติกรรมที่คุณต้องการ
catch
, unwind-protect
, condition-case
และชอบที่มีประโยชน์ มีทั้งส่วนของคู่มือ Elisp ที่อุทิศให้กับการออกนอกสถานที่ (และไม่มีอะไรพิเศษโดยเฉพาะอย่างยิ่งเกี่ยวกับพวกเขา IMO.)
catch
/throw
เป็นสำนวนที่มากกว่าใน elisp เนื่องจากวิธีการอื่น ๆ จะถูกนำไปใช้ในที่สุดในแง่ของการจับ / โยน คู่มือ Elisp กล่าวว่า "รุ่นอื่น ๆ ส่วนใหญ่ชัดรวมทั้งธรรมดาชัดมีหลายวิธีในการถ่ายโอนการควบคุม nonsequentially:return
,return-from
และgo
. เช่น Emacs เสียงกระเพื่อมมีเพียงthrow
."