読者です 読者をやめる 読者になる 読者になる

きくらげ観察日記

好きなことを、適当に。

Gaucheで#<eof>を返す

ジェネレーターを自作する場合なんかに#<eof>を返したくなる場合がありますが、以外とググッても方法が出てきません。

R6RSの(eof-object)を使えば簡単に生成できます。

;; 1からnまでの数を返すgeneratorを返す
(define (gen n)
  (define i 0)
  (^() (if (<= n i)
           (eof-object)
           (begin
             (inc! i)
             i))))

(define g (gen 2))
(g) ; => 1
(g) ; => 2
(g) ; => #<eof>

(generator->list (gen 5))
;; => (1 2 3 4 5)