「The Scheme Programming Language 4th Edition」に、以下のような例があります。
(define product
(lambda (ls)
(call/cc
(lambda (break)
(let f ([ls ls])
(cond
[(null? ls) 1]
[(= (car ls) 0) (break 0)]
[else (* (car ls) (f (cdr ls)))]))))))
(製品 '(1 2 3 4 5)) => 120
(製品 '(7 3 8 0 1 9 5)) => 0
その後、以下のように 3.3 で CPS に変換されます。
(define product
(lambda (ls k)
(let ([break k])
(let f ([ls ls] [k k])
(cond
[(null? ls) (k 1)]
[(= (car ls) 0) (break 0)]
[else (f (cdr ls)
(lambda (x)
(k (* (car ls) x))))])))))
(製品 '(1 2 3 4 5) (ラムダ (x) x)) => 120
(製品 '(7 3 8 0 1 9 5) (ラムダ (x) x)) => 0
自分でやりたい、対応するCPSは以下
(define (product ls prod break)
(cond
((null? ls)
(break prod))
((= (car ls) 0)
(break 0))
(else
(product (cdr ls) (* prod (car ls)) break))))
(製品 '(1 2 3 4 5) 1 (ラムダ (x) x)) => 120
(製品 '(1 2 0 4 5) 1 (ラムダ (x) x)) => 0
私のCPSは正しいですか?T よろしくお願いします!
よろしくお願いします