回答:
利用可能な多くのオプションがあります。
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))
自分でエラーを処理したい場合は、呼び出しコード(たとえば、最終的に呼び出すものへの呼び出しmy-func
)をに入れることができますcondition-case
。繰り返しますが、これはほとんどの場合、少なくともcatch
+ を使用するのと同じくらい頻繁に行われthrow
ます。それはすべてあなたが望む行動に依存します。
catch
/throw
はelispではより慣用的であることに注意してください。他のアプローチは最終的にcatch / throwの観点から実装されます。elispのマニュアルは言う:「Common Lispのを含めたLispの他のほとんどのバージョンは、非逐次的に制御を移すのいくつかの方法がありますreturn
、return-from
とgo
。例えば、Emacs Lispには、唯一持っていますthrow
。」