CLでSRFI-35 — #:g1

Posted 2012-02-20 13:34:00 GMT

CLでSRFI、今回は、SRFI-35の「Conditions」です。
CLでいうところのコンディションと同じようなものを実現するSRFIです。

動作

(define-condition-type &c &condition
  c?
  (x c-x))

(define-condition-type &c1 &c c1? (a c1-a))

(define-condition-type &c2 &c c2? (b c2-b))

(defvar v1 (make-condition &c1 :x "V1" :a "a1"))

(c? v1) ;=> T (c1? v1) ;=> T (c2? v1) ;=> NIL (c-x v1) ;=> "V1" (c1-a v1) ;=> "a1" (defvar v2 (condition (&c2 (x "V2") (b "b2"))))

(c? v2) ;=> T (c1? v2) ;=> NIL (c2? v2) ;=> T (c-x v2) ;=> "V2" (c2-b v2) ;=> "b2" (defvar v3 (condition (&c1 (x "V3/1") (a "a3")) (&c2 (b "b3"))))

(c? v3) ;=> T (c1? v3) ;=> T (c2? v3) ;=> T (c-x v3) ;=> "V3/1" (c1-a v3) ;=> "a3" (c2-b v3) ;=> "b3" (defvar v4 (make-compound-condition v1 v2))

(c? v4) ;=> T (c1? v4) ;=> T (c2? v4) ;=> T (c-x v4) ;=> "V1" (c1-a v4) ;=> "a1" (c2-b v4) ;=> "b2" (defvar v5 (make-compound-condition v2 v3))

(c? v5) ;=> T (c1? v5) ;=> T (c2? v5) ;=> T (c-x v5) ;=> "V2" (c1-a v5) ;=> "a3" (c2-b v5) ;=> "b2" (let ((c (make-compound-condition (make-condition &error) (make-condition &message :message "foo!!")))) (cl:error c)) ;>>> foo!! ;>>> [Condition of type #:ANONYMOUS-COMPOUND-CONDITION-2179]

移植について

CLのコンディションの仕組みの上で動いた方が便利だろうということで、define-conditionのラッパーになれば良いかなという感じで移植。
CLのコンディションと似ているので、やりたいこと自体はCLで素直に書けるのですが、このSRFI流のAPIを提供するには、CLのコンディションにMOPのようなものがないと厳しいかなと思いました。
ということで、かなり場当たり的で中途半端な感じになってしまいました。 ■

comments powered by Disqus