テスト

予定通りgauche.testで遊んでみようかと

(test* "hoge"  expected  test-code &opt cmp-fn)

思ったんだけどまあ当たり前のように当たり前。
メインは例外処理か。

(guard (e ((cond1) v1)
                 ((cond2) v2)
                 ( else     default-case))
   (body))

最初 ZERO DIVIDEひっかかるかと思って、

gosh> (guard (e (else e)) (/ 1 0))
+inf.0

おわっ、とのけぞる。すばらしい過ぎる。

gosh> (guard (e (else e)) (read))
)
#<read-error "Read error at "(stdin)":line 2 ...">
gosh> 

error, raiseで例外を投げる、と。なるほど。

gosh> (define (div a b) (if (= b 0) (error "zero divide" (list '/' a b)) (/ a b)))
div
gosh>  (div 10 3)
10/3
gosh>  (div 10 0)
*** ERROR: zero divide (/ a 0)
Stack Trace:
_______________________________________
gosh> (raise (make <error> :message "hoge"))
*** ERROR: hoge
Stack Trace:
_______________________________________

んでこのコンディションって何者?とか

gosh> (guard (e (else (class-of e))) (div 10 0))
#<class <error>>
gosh> (guard (e (else (class-of e))) (read))
)
#<class <read-error>>
gosh> (guard (e (else (class-of e))) (car 3))
#<class <error>>

わあ、とびっくり(ちとわざとらしいか)
ほかにどんなのがあるんだろう?
#というか総称関数とクラスに進みたくなってくる。