2010/05/25

Re: syntax-rules: update-if-true (cond-set!)

shiroさんにご指摘頂きました。大変恐縮です。。
仰る通りですね。(そりゃそうですよね)
(define-syntax cond-set!
(syntax-rules ()
((_ pred var init)
(if pred
(set! var init)))
((_ pred var1 init1 var2 init2 ...)
(if pred
(begin
(set! var1 init1)
(set! var2 init2) ...)))))
(let ((test 5)
(var 0))
(cond-set! (> test 4)
var 5)
(display var))
(let ((test 5)
(v1 0)
(v2 0))
(cond-set! (> test 4)
v1 1 v2 2)
(display v1)
(display v2))
(let ((test 5)
(v1 0)
(v2 0)
(v3 0)
(v4 0)
(v5 0))
(cond-set! (> test 4)
v1 1 v2 2 v3 3 v4 4 v5 5)
(for-each display (list v1 v2 v3 v4 v5)))
; -> 15000#<undef>


こうでしょうか。。
(define-syntax cond-set!
(syntax-rules ()
((_ pred var init)
(if pred
(set! var init)))
((_ pred var1 init1 var2 init2)
(if pred
(begin
(set! var1 init1)
(set! var2 init2))))
((_ pred var1 init1 var2 init2 ...)
(let ((p pred))
(if p
(begin
(cond-set! p var1 init1)
(cond-set! p var2 init2 ...)))))))
(let ((test 5)
(v1 0)
(v2 0)
(v3 0)
(v4 0)
(v5 0))
(cond-set! (> test 4)
v1 1 v2 2 v3 3 v4 4 v5 5)
(for-each display (list v1 v2 v3 v4 v5)))


教えて頂きました。
って、ここは・・・偶然にも今日、眺め始めたページ(笑)

追記

引数2つのところはいらないかな?
(define-syntax cond-set!
(syntax-rules ()
((_ pred var init)
(if pred
(set! var init)))
;; ((_ pred var1 init1 var2 init2)
;; (if pred
;; (begin
;; (set! var1 init1)
;; (set! var2 init2))))
((_ pred var1 init1 var2 init2 ...)
(let ((p pred))
(if pred
(begin
(cond-set! p var1 init1)
(cond-set! p var2 init2 ...)))))))
(let ((test 5)
(v1 0)
(v2 0)
(v3 0)
(v4 0)
(v5 0))
(cond-set! (> test 4)
v1 1 v2 2 v3 3 v4 4 v5 5)
(for-each display (list v1 v2 v3 v4 v5)))


プログラミングGauche

0 件のコメント:

コメントを投稿