[Gauche-devel-jp] call-with-iteratorのend?の書き方

Back to archive index

yasuy****@timed***** yasuy****@timed*****
2004年 1月 30日 (金) 22:37:40 JST


えんどうです。

call-with-iterator の end? 書き方で悩んでいます。

MySQL の mysql_fetch_row 関数は、
実行した後でないと次の行が無いことが分かりません。

(define-method call-with-iterator ((r <mysql-result-set>) proc . option)
  (if (not (slot-ref r 'open))
      (raise
       (make <dbi-exception> :error-code -4 :message "<mysql-result> already closed.")))
  (let ((is-end #f))
    (define (end?) is-end)
    (define (next)
      (let ((row (mysql-fetch-row (slot-ref r '%result-set))))
	(if (null? row) (set! is-end #t))
	(if (equal? row '()) (set! is-end #t))
	row))
    (proc end? next)))

このような call-with-iterator を書き、

+------+----------+
| id   | name     |
+------+----------+
|   10 | nobsun   |
|   20 | yasuyuki |
+------+----------+

このようなテーブルに対して 

 (display (map (lambda (row) (list (dbi-get-value row 0) (dbi-get-value row 1))) result))

を実行させると、以下のように末尾に ('() '()) が付加されてしまいます。

((10 nobsun) (20 yasuyuki) (() ()))

mysql_fetch_row のように、
実行しないと終りが分からない場合、end? はどう書くのが良いのでしょうか...?

-- 
ENDO Yasuyuki <yasuy****@timed*****>
http://www.kahua.org/
http://www.timedia.co.jp/




Gauche-devel-jp メーリングリストの案内
Back to archive index