Gauche > Archives > 2013/05/06

2013/05/06 09:21:47 UTCyamasushi
#
(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) ) )
#
これでも同じ結果でした。
2013/05/06 22:11:35 UTCyamasushi
#
; 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にする、といったことが可能になりました。
2013/05/06 23:58:53 UTCyamasushi
#
こうしてみると、generatorとstreamは等価に扱えることになり、無限列として識別して保持したいときにはstreamに変換するという使い方ができますね。(stream?が使えるので。)
#
逆に、streamで書かれたライブラリを遅延シーケンスで扱う、といった使い方もできるのかな?とか。