[Gauche-devel-jp] Bug libsrc/gauche/collection.scm (CVS HEAD)

Back to archive index

Takahiro Horii horii****@ike*****
2006年 1月 7日 (土) 19:44:07 JST


こんにちは。堀井です。

CVS HEAD の libsrc/gauche/collection.scm の maybe-minimum-size につい
てです。
この手続きは、lazy-size-of がプロミスを返した時点で、#f を返すべきでは
ないでしょうか?
以下のような lazy-size-of がプロミスを返すクラスを作った場合、
map-to, map-to-with-index が変な出力を出すことがあります。

(define-class <list*> (<sequence>)
  ((list :init-keyword :list)))

(define-method lazy-size-of ((l <list*>))
  (delay (length (ref l 'list))))

(define-method call-with-iterator ((l <list*>) proc . opts)
  (apply call-with-iterator (ref l 'list) proc opts))

gosh> (map-to <vector> list (make <list*> :list '(1 2)) '(3 4 5))
#((1 3) (2 4) #<undef>)

以下パッチです。

--- collection.scm.orig	2006-01-07 18:58:11.509559627 +0900
+++ collection.scm	2006-01-07 18:57:18.077024083 +0900
@@ -172,17 +172,17 @@
   (let1 size (and-let* ((siz (lazy-size-of col))
                         ( (integer? siz) ))
                siz)
-    (if (null? more)
+    (if (or (null? more) (not size))
       size  ;; short path
       (let loop ((cols more)
                  (r    size))
         (if (null? cols)
           r
           (let1 size (lazy-size-of (car cols))
-            (loop (cdr cols)
-                  (cond ((not (integer? size)) r)
-                        ((not (integer? r)) size)
-                        (else (min r size))))))))))
+            (if (not (integer? size))
+                #f
+                (loop (cdr cols)
+                      (min r size)))))))))
 
 ;;----------------------------------------------------
 ;; Derived operations


--
Takahiro Horii <horii****@ike*****>



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