次の例では、継続にジャンプして終了します。誰かが関数の流れを説明することができます。私は継続の周りを円で移動しており、関数の入口点と出口点を知らない。scheme continuations -need説明
(define (prod-iterator lst)
(letrec ((return-result empty)
(resume-visit (lambda (dummy) (process-list lst 1)))
(process-list
(lambda (lst p)
(if (empty? lst)
(begin
(set! resume-visit (lambda (dummy) 0))
(return-result p))
(if (= 0 (first lst))
(begin
(call/cc ; Want to continue here after delivering result
(lambda (k)
(set! resume-visit k)
(return-result p)))
(process-list (rest lst) 1))
(process-list (rest lst) (* p (first lst))))))))
(lambda()
(call/cc
(lambda (k)
(set! return-result k)
(resume-visit 'dummy))))))
(define iter (prod-iterator '(1 2 3 0 4 5 6 0 7 0 0 8 9)))
(iter) ; 6
(iter) ; 120
(iter) ; 7
(iter) ; 1
(iter) ; 72
(iter) ; 0
(iter) ; 0
ありがとうございます。
答えはありがたいですが、依然として不明です。あなたは詳細をもっと詳細に説明することができますか? – riship89
それはまだ不明ですか? –
これは以前のものよりはるかに優れています。私は何度か読んだ後にそれを理解しました。今、私はそれを実装しようとしています。ところで、ありがとう。それは多くの助けとなりました。再度、感謝します。 – riship89