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*****>