[Gauche-devel-jp] string-upcase!とlist=のバグ

Back to archive index

OGURISU Osamu oguri****@kanaz*****
2007年 5月 23日 (水) 11:29:09 JST


小栗栖です。

Linux上の version 0.8.10 [utf-8,pthreads] な gosh の
string-upcase! が動かなくなっています。うちだけでしょうか?
0.8.9では正常でした。

gosh> (gauche-version)
"0.8.10"
gosh> (use srfi-13)
#<undef>
gosh> (string-upcase #`"abc")
"ABC"
gosh> (string-upcase! #`"abc")
*** ERROR: real number required: #<undef>
Stack Trace:
_______________________________________
gosh> 

また、srfi-1のlist=が

(list= eq? '(1 2 3) '(1 2 3) '(1 2 3)) => #f

となってしまいます。これはsrfi-1の参照実装がそもそもおかし
いようで、次のように修整してみました。コメントアウトされた
行が参照実装のコードで、新しく入れたlist-b2と元々のlist-b 
との区別が必要のようです。

(define (list= = . lists)
  (or (null? lists) ; special case
      
      (let lp1 ((list-a (car lists)) (others (cdr lists)))
        (or (null? others)
            (let ((list-b (car others))
                  (others (cdr others)))
              (if (eq? list-a list-b)	; EQ? => LIST=
                  (lp1 list-b others)
                  ;; (let lp2 ((list-a list-a) (list-b list-b))
                  (let lp2 ((list-a list-a) (list-b2 list-b))
                    (if (null-list? list-a)
                        ;; (and (null-list? list-b)
                        (and (null-list? list-b2)
                             (lp1 list-b others))
                        ;; (and (not (null-list? list-b))
                        (and (not (null-list? list-b2))
                             ;; (= (car list-a) (car list-b))
                             (= (car list-a) (car list-b2))
                             ;; (lp2 (cdr list-a) (cdr list-b)))))))))))
                             (lp2 (cdr list-a) (cdr list-b2)))))))))))


最近はありがたく楽しくgaucheを使わせてもらってるだけで、久
しぶりにソースをみたのはひさしぶりだったんですが、SRFIの部
分は(も)SchemeからCに自動変換されてるんですね。list=の修整
もSchemeレベルで確かめただけで、string-upcase!のほうはどこ
がおかしいか追えませんでした。報告まで。

-- 小栗栖 修 / OGURISU Osamu




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