CLでSRFI-34 — #:g1

Posted 2012-03-06 11:24:00 GMT

CLでSRFI、今回は、SRFI-34の「Exception Handling for Programs」です。
CLでいう、handler-bindや、handler-caseのような仕組みを提供するSRFIです。

動作

(guard (condition
        ((assoc 'foo condition) :=> #'cdr)
        (:else (describe condition)))
  (raise '((foo . bar) (baz . quux))))
;=>  BAR

(guard (condition
        (:else (describe condition)))
  (cl:error "foo"))
;>>  #<SIMPLE-ERROR "foo" {1018297BA3}>
;>>    [condition]
;>>
;>>  Slots with :INSTANCE allocation:
;>>    FORMAT-CONTROL    = "foo"
;>>    FORMAT-ARGUMENTS  = NIL
;>>
;=>  <no values>

移植について

CLのコンディションシステムと共存させたかったので、raiseが投げるコンディションとオブジェクトは、任意のオブジェクトをスロットに格納したsrfi-34-condition(cl:conditionを継承)を投げるということにして、with-exception-handlerにraiseで投げられたオブジェクトを拾う仕組みを追加してみました。
srfi-34のコンディション以外は、特別扱いせず、guardの中の変数は、コンディションを束縛します。
キーワードは例によってキーワードパッケージのシンボルにしました。

comments powered by Disqus