#(use gauche.parameter)
(use util.stream)
(define rp-dict (make-parameter #f))
;; trivial, but for completeness
(define (null-generator) (eof-object))
(let1 obj ($ stream-car $ iterator->stream (^[n e] (n 1) (e) ) )
(parameterize ( [rp-dict "hoge" ] )
#?=(rp-dict)
(write obj) (flush)
#?=(rp-dict) ) )
#streamでは問題なく動いているようです。念の為確認して見ました。
#>gosh /home/shuji/gauche/debug/test.scm
#?="/home/shuji/gauche/debug/test.scm":11:(rp-dict)
#?- "hoge"
1#?="/home/shuji/gauche/debug/test.scm":13:(rp-dict)
#?- "hoge"
#ということは、generateをcall/ccで書けばOKということに?
#あ、すみません間違えました。
#(use gauche.parameter)
(use util.stream)
(define rp-dict (make-parameter #f))
(let1 obj (iterator->stream (^[n e] (n 1) (e) ) )
(parameterize ( [rp-dict "hoge" ] )
#?=(rp-dict)
(write (stream-car obj)) (flush)
#?=(rp-dict) ) )
#これでも同じ結果でした。
#; stream->generator
(define (stream->generator s)
(if (stream? s)
(^[]
(if (stream-null? s)
(eof-object)
(begin0 (stream-car s) (set! s (stream-cdr s) ) ) ) )
(errorf "~a is not stream" s) ) )
http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3astream%E3%81%A8generator
#このような手続きを作って見ました。これで、部分継続の問題がわかったときだけ、一時的にstreamにする、といったことが可能になりました。
#こうしてみると、generatorとstreamは等価に扱えることになり、無限列として識別して保持したいときにはstreamに変換するという使い方ができますね。(stream?が使えるので。)
#逆に、streamで書かれたライブラリを遅延シーケンスで扱う、といった使い方もできるのかな?とか。