мой Роспотребнадзор прав?
В "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
Позже он преобразуется в CPS в 3.3, как показано ниже
(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))))])))))
(product '(1 2 3 4 5) (lambda (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 (lambda (x) x)) = > 0
Я хочу спросить, прав ли мой CPS? Т Заранее спасибо!
С НАИЛУЧШИМИ ПОЖЕЛАНИЯМИ
1 ответ:
Я думаю, что это правильная реализация:
(define inside-product #f) ;; to demonstrate the continuation (define (product ls prod break) (cond ((null? ls) (begin (set! inside-product prod) (prod 1))) ((= (car ls) 0) (break 0)) (else (product (cdr ls) (lambda (x) (prod (* (car ls) x))) break)))) (define identity (lambda (x) x))
Идея CPS состоит в том, чтобы отслеживать рекурсию.
> (product (list 1 2 3) identity identity) 6 > (inside-product 4) 24