Island Life

< 6行でプレゼント交換(最高にキモい Scheme... | らむ太は最近、椅子に乗ると高いところに手... >

2006/12/25

12/22のrangeジェネレータだが、ジェネレータと範囲を取ってジェネレータを 返す方が綺麗だな。

(define-constant *eof* (read-from-string ""))
(define (eof) *eof*)

(define (generator-range begin? end? gen)
  (define next #f)
  (define (in)
    (let1 elt (gen)
      (cond ((eof-object? elt) (set! next eof) *eof*)
            ((end? elt) (set! next out)))
      elt))
  (define (out)
    (let1 elt (gen)
      (cond ((eof-object? elt) (set! next eof) *eof*)
            ((begin? elt) (set! next in) elt)
            (else (out)))))
  (set! next out)
  (lambda () (next)))

これで

gosh> (with-input-from-process "w3m -dump_source http://www.yahoo.com"
        (cut port-for-each print (generator-range #/^<style/ #/<\/style>/ read-line)))
<style type="text/css">
a{color:#16387c;}
a:link,a:visited{text-decoration:none;}
a:hover{text-decoration:underline;}
</style>
<style type="text/css" media="all">
#p{width:310px;}
form{margin:0;}
</style>
#<undef>

こうなる。

Tag: Gauche