2010/06/02

戻り値 Re: syntax-rules: when, unless

when や unless って、戻り値が undef より #f の方が好みかも。なぜその方が良いかと言われると困るけど・・・。未定義が返るより、安心するというか。

;; when
(define-syntax my-when
(syntax-rules ()
((_ pred body ...)
(if pred
(begin
body ...)
#f))))
(when #f)
;; #<undef>
(my-when #f)
;; #f
(((lambda (f)
(f f))
(lambda (f)
(lambda (n)
(my-when (< 0 n)
(print n)
((f f)(- n 1)))))) 5)
;; 5
;; 4
;; 3
;; 2
;; 1
;; #f
(((lambda (f)
(f f))
(lambda (f)
(lambda (n)
(when (< 0 n)
(print n)
((f f)(- n 1)))))) 5)
;; 5
;; 4
;; 3
;; 2
;; 1
;; #<undef>
(((lambda (f)
(f f))
(lambda (f)
(lambda (n)
(my-when (< 0 n)
(print n)
((f f)(- n 1)))))) -1)
;; #f


Gauche の when, unless って、戻り値が未定義なわけですが、もしかしてその方が良い理由とかあったりするのかなー。
まー、戻り値が欲しいケースに出会った時に、when を上書いてしまえば良いのかな。そういう問題でもないのかな。うーん。

上書くというかシャドウするとか。
(let-syntax ((when (syntax-rules ()
((_ pred body ...)
(if pred
(begin body ...) #f)))))
(when #t)
(when #f))
;; #f
(when #f)
;; #<undef>
view raw shadow.scm hosted with ❤ by GitHub


when, unless で戻り値を利用するケースが発生すること自体、何か見直しが必要ということなのかも?

なんだか、以前も同じようなことをどこかで言ったような見たような・・・。そして教えてもらったような気も・・・。忘れた・・・orz

プログラミングGauche

0 件のコメント:

コメントを投稿