Gauche:Bugs:log6

Gauche:Bugs:log6

最新のもの: Gauche:Bugs


text.html-lite(0.8.6)

2006/04/08 22:07:06 PDT: 些細なことなんですが、 例えば(html:body)は

("<" body ">" "</" body "\n>")

でなく、

("<" body ">" "</" body ">\n")

となるべきではないでしょうか。

--- html-lite.scm.original      2006-04-09 13:55:14.000000000 +0900
+++ html-lite.scm       2006-04-09 13:47:12.000000000 +0900
@@ -126,7 +126,7 @@
             (list "<" name attr " />")))
         (lambda args
           (receive (attr args) (get-attr args '())
-            (list "<" name attr ">" args "</" name "\n>"))))))
+            (list "<" name attr ">" args "</" name ">\n"))))))

 (define-macro (define-html-elements . elements)
   (define (make-scheme-name name)

gauche-install -d でオーナー/グループ/モードの指定が効かない(CVS HEAD)

(2006/04/06 07:30:28 PDT): -d でディレクトリを作成する際、-o/-g/-mの指定が効きません。

Index: src/gauche-install.in
===================================================================
RCS file: /cvsroot/gauche/Gauche/src/gauche-install.in,v
retrieving revision 1.2
diff -u -r1.2 gauche-install.in
--- src/gauche-install.in       17 Jul 2005 04:01:36 -0000      1.2
+++ src/gauche-install.in       6 Apr 2006 14:26:16 -0000
@@ -85,15 +85,26 @@
   (newline (current-error-port))
   (exit 1))
 
-(define (ensure-directory path)
+(define (ensure-directory path . args)
   (if (file-exists? path)
       (unless (file-is-directory? path)
         (app-errorf "non-directory file gets in my way: ~s" path))
-      (do-it #`"creating directory ,path"
-             (with-error-handler
+      (let-optionals* args ((mode #f)
+                           (owner #f)
+                           (group #f))
+       (do-it #`"creating directory ,path"
+              (with-error-handler
                  (lambda (e)
                    (app-errorf "can't create directory: ~s" (ref e 'message)))
-               (lambda () (make-directory* path))))))
+                (lambda ()
+                  (and (make-directory* path)
+                       (begin
+                         (when mode (sys-chmod path mode))
+                         (when (or owner group)
+                           (sys-chown path
+                                      (->ugid sys-user-name->uid owner "user")
+                                      (->ugid sys-group-name->gid group "group")))))
+                  ))))))
 
 ;; user/group -> uid/gid
 (define (->ugid str->id arg type)
@@ -155,7 +166,7 @@
                    (dry-run dry))
       (when shebang (set! shebang #`"#!,shebang?n"))
       (cond
-       (mkdir  (for-each ensure-directory args))
+       (mkdir  (for-each (cut ensure-directory <> mode owner group) args))
        (target (for-each (lambda (src)
                            (let1 dst (build-path target src)
                              (ensure-directory (sys-dirname dst))

日本語infoドキュメントの体裁が崩れたり、文字化けする(0.8.6)

yokota(2006/04/01 14:56:26 JST): Gauche の標準漢字コードが EUC-JP から UTF-8 になったのに合わせて付属の日本語 info ドキュメントの文字コードが UTF-8 になりましたが、これが原因で問題が起こっています。

このため、現状ではドキュメントの処理に UTF-8 を用いるのは時期尚早かと思います。

Shiro(2006/04/01 14:00:19 PST): そっちで問題が出ましたか… utf-8に変更したのは、 新しいtexi2htmlのためなんです。こいつがutf-8を要求しますんで。 make時にそれぞれ変換かけるしかないかな。

yokota(2006/04/01 13:41:28 JST): 手元にある texi2html-1.76 では Makefile の通りに処理しても html 文章は utf-8 なのに文書の先頭部にある charset が us-ascii になってしまうので正しく表示できません。 これは texi2html に具体的な日本語サポートが無いために英語文書と見なして処理してしまうためです。処理時にその旨警告が出ます。

この場合は texi2html の Unicode サポートを無効にします。現状ではコマンドラインオプションからは無効にできないので、以下のようにします。

まず、以下のような初期設定ファイル "ja-init.pl" を作成します。

# -*- mode: perl -*-

$USE_UNICODE = 0;
# $ENCODING = "euc-jp";

1;

更に texinfo ドキュメントの先頭に

@documentencoding euc-jp

を追加します。追加する代わりに上のファイルでコメントになっている部分のように初期設定ファイルで指定しても良いです。この状態で以下のようなコマンドを実行すると euc-jp の html ドキュメントが生成できます。

$ texi2html --init-file=ja-init.pl gauche-refj.texi

Shiro(2006/04/02 00:13:26 PST): 私の手元のtexi2htmlも1.76なんですが、--lang=ja をつけるとcharset=utf-8を出してくれてたうえにメッセージカタログも日本語に なります。コンパイルオプションの違いでしょうか。ただその場合、utf-8以外の エンコーディングにする方法がわからなかったのと、メッセージカタログ自体に 間違いがある ( http://practical-scheme.net/gauche/man/gauche-refj.html の 一番下の行を見てください) んでちょっと困ってました。

ja-init.plを用意する方法だとメッセージカタログは英語のままなんですよね? そっちの方がいいな。

yokota(2006/04/02 19:41:59 JST): はい、英語のままになります。 今気が付きましたが、上で述べた方法だと <body> タグの lang 属性が "en" のままになりますね。あまり良い方法では無かったかもしれません。

カタログファイルそのものは texinfo ドキュメントのあるディレクトリに "i18n/ja" というファイルを置いてそこに記述すればそちらを使ってくれるようです。カタログファイルの構造は texi2html のソースコードを参照して下さい。( http://download.savannah.gnu.org/releases/texi2html/ ) カタログファイルは上記以外にも幾つかの場所に置けるようです。

私が現在使用している物や上の URL で見つかる texi2html 1.76 は日本語のカタログを持っていません。Shiro さんの texi2html は改良版かもしれません。

Shiro(2006/04/07 06:23:52 PDT): ja-init.plを用意する方向で変更しました。 lang属性はhtmlを作った後にsedで書き換えています。

gauche.reload で class が保護されない(-CVS HEAD)

leque(2006/03/28 09:09:15 PST): reload の第二引き数でクラスを保護するように指定しても、クラスに再定義フラグが立ってしまいます。

;;; hoge.scm
(define-module hoge

  (export-all))

(select-module hoge)

(define-class <bar> () ())

(define-method foo ((x <bar>))
  "foo")

(provide "hoge")
% gosh -u hoge
gosh> (foo (make <bar>))
"foo"
gosh> <bar>
#<class <bar>>
gosh> (use gauche.reload)
#<undef>
gosh> (reload-verbose #t)
#f
gosh> (reload 'hoge '((hoge <bar>)))
keeping value of <bar>
#<undef>
gosh> (foo (make <bar>))
*** ERROR: no applicable method for #<generic foo (1)> with arguments (#<<bar>:redefined 0x798b28>)
Stack Trace:
_______________________________________
gosh> <bar>
#<class <bar> (redefined)>

ext/threads/threads.c (CVS HEAD)

(2006/03/25 03:00:17 PST): バグじゃないですし、些末なことで恐縮ですが、変数dummyは不要なんじゃないかと思いました。

Index: ext/threads/threads.c
===================================================================
RCS file: /cvsroot/gauche/Gauche/ext/threads/threads.c,v
retrieving revision 1.9
diff -u -r1.9 threads.c
--- ext/threads/threads.c       22 Jul 2005 09:26:55 -0000      1.9
+++ ext/threads/threads.c       25 Mar 2006 00:26:05 -0000
@@ -156,7 +156,7 @@
 #ifdef GAUCHE_USE_PTHREADS
     int err_state = FALSE, err_create = FALSE;
     pthread_attr_t thattr;
-    sigset_t omask, dummy;
+    sigset_t omask;
 
     (void)SCM_INTERNAL_MUTEX_LOCK(vm->vmlock);
     if (vm->state != SCM_VM_NEW) {
@@ -171,7 +171,7 @@
             vm->state = SCM_VM_NEW;
             err_create = TRUE;
         }
-        pthread_sigmask(SIG_SETMASK, &omask, &dummy);
+        pthread_sigmask(SIG_SETMASK, &omask, NULL);
         pthread_attr_destroy(&thattr);
     }
     (void)SCM_INTERNAL_MUTEX_UNLOCK(vm->vmlock);

gauche.macroutil (0.8.6)

2006/03/18 05:43:34 PST

%gosh
gosh> (use gauche.macroutil)
#<undef>
gosh> (xmac #t)
*** ERROR: unbound variable: %macro-expand
Stack Trace:
_______________________________________
  0  (unwrap-syntax (%macro-expand #t))
        [unknown location]
  1  (unwrap-syntax (%macro-expand #t))
        [unknown location]
  2  (%macro-expand #t)
        [unknown location]
gosh> (xmac1 #t)
*** ERROR: unbound variable: %macro-expand-1
Stack Trace:
_______________________________________
  0  (unwrap-syntax (%macro-expand-1 #t))
        [unknown location]
  1  (unwrap-syntax (%macro-expand-1 #t))
        [unknown location]
  2  (%macro-expand-1 #t)
        [unknown location]
--- macroutil.scm.org   Sat Mar 18 22:04:33 2006
+++ macroutil.scm       Sat Mar 18 22:04:46 2006
@@ -15,11 +15,11 @@
 (define-syntax xmac
   (syntax-rules ()
     ((_ ?form)
-     (unwrap-syntax (%macro-expand ?form)))))
+     (unwrap-syntax (%macroexpand ?form)))))
 
 (define-syntax xmac1
   (syntax-rules ()
     ((_ ?form)
-     (unwrap-syntax (%macro-expand-1 ?form)))))
+     (unwrap-syntax (%macroexpand-1 ?form)))))
 
 (provide "gauche/macroutil")

gauche-install.in の-Tオプションに絶対パスを渡すとエラー(-0.8.6)

(2005/11/18 05:52:20 PST)

mingw(とmsys環境)でビルドしたものです。 WindowsMeとWindowsXPの両方で再現を確かめました。

$ gosh gauche-install.in -T /testdir/1/2/3 test.scm
can't create directory: "stat failed for D:: ?xffA?xffN?xffZ?xffX?xff?xff?xff?xff?xffロ・xff?xff黷彌xff?xff?xff?xff?xffB?r?n"

method sortingのテストでfail(CVS HEAD)

2006/03/05 01:50:54 PST時点でCVS HEADをmake/make checkすると、failしました。cut-sea

Testing object system ...                                        failed.
discrepancies found.  Errors are:
test method sorting: expects 1 => got 0

configureオプションはこれです。

cut-sea@nkisi> uname -rms
NetBSD 2.0.2 i386
cut-sea@nkisi> gauche-config --reconfigure
./configure '--with-slib=/usr/pkg/share/slib'
            '--with-local=/usr/pkg'
            '--with-prefix=/usr/local'
            '--enable-ipv6'
            '--with-rpath=/usr/local/lib:/usr/pkg/lib:/usr/lib'
            '--with-iconv=/usr/pkg'
            '--enable-multibyte=euc-jp'
            '--enable-threads=pthreads'

((('a 'b) 'c |...|))を評価すると、cenv-lookupのASSERT(SCM_IDENTIFIERP(name))でエラーとなる (CVS HEAD)

koguro(2006/03/04 20:11:25 PST): 0.8.7_pre1のGaucheで((('a 'b) 'c |...|))を評価するとAssertion failedとなります。

% gosh
gosh> ((('a 'b) 'c |...|))
"intlib.c", line 1447 (intlib_cenv_lookup): Assertion failed: SCM_IDENTIFIERP(name)

組み込みクラスでは、mutexを初期化しないでlock/unlockしている(CVS HEAD)

(2006/03/04 00:05:24 PST): この影響で、NetBSD上でマルチスレッド版Gaucheで組み込みクラスをdescribeするとコアダンプします。

% gosh
gosh> (describe <string>)
#<class <string>> is an instance of class <string-meta>
slots:
  name      : <string>
  cpl       : (#<class <string>> #<class <sequence>> #<class <collection>>
  direct-supers: (#<class <sequence>>)
  accessors : ()
  slots     : ()
  direct-slots: ()
  num-instance-slots: 0
  direct-subclasses: ()
  direct-methods: ()
  initargs  : ()
  defined-modules: ()
gosh: Error detected by libpthread: Invalid mutex.
Detected by file "/usr/src/lib/libpthread/pthread_mutex.c", line 334, function "pthread_mutex_unlock".
See pthread(3) for information.
zsh: abort (core dumped)  gosh
% gosh
gosh> (ref <string> 'redefined)
gosh: Error detected by libpthread: Invalid mutex.
Detected by file "/usr/src/lib/libpthread/pthread_mutex.c", line 334, function "pthread_mutex_unlock".
See pthread(3) for information.
zsh: abort (core dumped)  gosh
%

そもそも現状のGaucheでは組み込みクラスの再定義が許されているのは、カテゴリーがSCM_CLASS_SCHEMEだけのようなので、次のようにしてしまっていいのではないかと思います。(2006/03/04 01:00:41 PSTに説明とパッチを書き換えました)

Index: src/class.c
===================================================================
RCS file: /cvsroot/gauche/Gauche/src/class.c,v
retrieving revision 1.133
diff -u -r1.133 class.c
--- src/class.c 9 Feb 2006 08:59:21 -0000       1.133
+++ src/class.c 4 Mar 2006 08:58:02 -0000
@@ -730,7 +730,8 @@
     int abandoned = FALSE;
     
     /* If this class is being redefined by other thread, you should wait */
-    (void)SCM_INTERNAL_MUTEX_LOCK(klass->mutex);
+    if (SCM_CLASS_CATEGORY(klass) == SCM_CLASS_SCHEME)
+       (void)SCM_INTERNAL_MUTEX_LOCK(klass->mutex);
     while (SCM_VMP(klass->redefined)) {
         if (SCM_VM(klass->redefined)->state == SCM_VM_TERMINATED) {
             /* TODO: this means redefinition of klass has been abandoned,
@@ -739,11 +740,13 @@
             abandoned = TRUE;
             klass->redefined = SCM_FALSE;
         } else {
-            (void)SCM_INTERNAL_COND_WAIT(klass->cv, klass->mutex);
+           if (SCM_CLASS_CATEGORY(klass) == SCM_CLASS_SCHEME)
+               (void)SCM_INTERNAL_COND_WAIT(klass->cv, klass->mutex);
         }
     }
     r = klass->redefined;
-    (void)SCM_INTERNAL_MUTEX_UNLOCK(klass->mutex);
+    if (SCM_CLASS_CATEGORY(klass) != SCM_CLASS_SCHEME)
+       (void)SCM_INTERNAL_MUTEX_UNLOCK(klass->mutex);
     if (abandoned) {
         Scm_Warn("redefinition of class %S has been abandoned", klass);
     }
%

と思ったんですが、これだとmake check中、class redefinition (part 1)の途中で刺さりますね。うーむ。

rest 引数がある場合に、選択されるメソッドがおかしい (0.8.6)

horii(2006/02/14 19:43:18 PST): katsujiro さんのページで見かけたのですが、以下ってバグではないでしょうか。 共に rest 引数があって必須引数の数が異なるときに、選択されるメソッドがメソッドの定義順によって変わったりします。

gosh> (define-method foo ((x <string>) . rest) 'foo-1)
#<generic foo (1)>
gosh> (define-method foo rest 'foo-2)
#<generic foo (2)>
gosh> (define-method bar rest 'bar-1)
#<generic bar (1)>
gosh> (define-method bar ((x <string>) . rest) 'bar-2)
#<generic bar (2)>
gosh> (foo "foo" "bar")
foo-2
gosh> (bar "foo" "bar")
bar-2
--- class.c.orig        2006-02-15 12:02:08.705318426 +0900
+++ class.c     2006-02-15 12:02:39.415030050 +0900
@@ -2052,6 +2052,11 @@
             Scm_Panic("internal error: couldn't determine more specific method.");
         }
     }
+    if (SCM_PROCEDURE_REQUIRED(x) > SCM_PROCEDURE_REQUIRED(y)) {
+      return TRUE;
+    } else if (SCM_PROCEDURE_REQUIRED(x) < SCM_PROCEDURE_REQUIRED(y)) {
+      return FALSE;
+    }
     /* all specializers match.  the one without optional arg is more special.*/     if (SCM_PROCEDURE_OPTIONAL(y)) return TRUE;
     else return FALSE;

gosh対話環境でキーボード入力する関数を起動すると先頭で余分な改行が入力される(0.8.6)

Shiro(2006/02/17 12:02:52 PST): 長くなったので移動します→Gauche:対話環境での入出力

dbiに不正なSQLを渡すと"unbound variable: sql"になる (0.8.6)

shibata (2006/01/26 07:33:37 PST) generate-sql/parametersの<dbi-unsupported-error>を発生させる箇所から sqlが見えてませんでした。

--- dbi.scm.orig        2006-01-27 00:26:36.000000000 +0900
+++ dbi.scm     2006-01-26 23:39:29.000000000 +0900
@@ -255,9 +255,9 @@
       (call-with-output-string
         (lambda (p)
           (with-port-locking p
-            (cut generate-sql/parameters conn tokens args p)))))))
+            (cut generate-sql/parameters conn tokens args p sql)))))))

-(define (generate-sql/parameters conn tokens args p)
+(define (generate-sql/parameters conn tokens args p sql)
   (let loop ((tokens tokens)
              (args   args)
              (delim  #t))

プロファイラを使うとprocess-output->stringが正しく動作しなくなることがある (0.8.6)

koguro (2006/01/21 06:30:12 PST): gosh -ptimeでプロファイラをONにするとprocess-output->stringがちゃんと動作しないことがあります(以下のように空文字列が返ってくる)。ただし、条件が分からないのですがうまく動くときもあります。

% uname -a
Darwin atropos.local 8.4.0 Darwin Kernel Version 8.4.0: Tue Jan  3 18:22:10 PST 2006; root:xnu-792.6.56.obj~1/RELEASE_PPC Power Macintosh powerpc
% gosh                     
gosh> (use gauche.process)
#<undef>
gosh> (process-output->string "ls")
"AUTHORS COPYING ChangeLog"

% gosh -ptime
gosh> (use gauche.process)
#<undef>
gosh> (process-output->string "ls")
""

Improper list な macro use が弾かれる (0.8.6 - CVS)

井上 (2006/01/20 22:09:42 PST)

 jun@debian /dvl/gauche/current
 $ gosh
 gosh> (let-syntax
           ((macro (syntax-rules ()
                     ((_ . _) 'mismatch))))
         (list (macro 0 1 2 . 3)))
 *** ERROR: Compile Error: proper list required for function application: (macro 0 1 2 . 3)
 "(stdin)":1:(let-syntax ((macro (syntax-rules () ...
 
 Stack Trace:
 _______________________________________
 gosh> (let-syntax
           ((macro (syntax-rules ()
                     ((_ . _) 'mismatch))))
         (macro 0 1 2 . 3))
 mismatch

R5RS の記述を見る限りでは別に間違った動作ではないようですが、動作の一貫性の無さから不具合と判断しました。(2006/01/21 11:27:56 PST: link 張り間違えてました。失礼。)

sql-tokenizeに大きな文字列を渡すとエラー (0.8.6)

shibata 2006/01/18 08:39:15 PST sql-tokenizeに巨大な文字列を渡すと正規表現のスタックが溢れてしまう?

 gosh> (use text.sql)
 gosh> (sql-tokenize (format "~s" (make-string 12340 #?A)))
 *** ERROR: stack overrun during matching regexp #/^?"((?:[^?"]|?"?")*)?"/

バックトラックが発生するような正規表現を使う時はMAX_STACK_USAGEを超えないように 気を付ける必要があるんですかね.

正規表現を使わない方針でsql-tokenizeにパッチを当ててみたんですが, 文字列操作の効率が悪いんじゃないか不安です.

*** sql.scm.orig        2005-08-31 14:46:32.000000000 +0900
--- sql.scm     2006-01-19 00:58:25.000000000 +0900
***************
*** 166,184 ****
    ;;
    ;; subscanners
    ;;
    (define (scan-string s r)
!     (cond ((#/^'((?:[^']|'')*)'/ s)
             => (lambda (m)
!                 (entry (m 'after)
!                        (cons `(string ,(regexp-replace-all #/''/ (m 1) "'"))
                               r))))
            (else
             (e "unterminated string literal in SQL: ~s" sql-string))))
    (define (scan-delimited s r)
!     (cond ((#/^?"((?:[^?"]|?"?")*)?"/ s)
             => (lambda (m)
!                 (entry (m 'after)
!                        (cons `(delimited ,(regexp-replace-all #/""/ (m 1) "?""))
                               r))))
            (else
             (e "unterminated delimited identifier in SQL: ~s" sql-string))))
--- 166,198 ----
    ;;
    ;; subscanners
    ;;
+   (define (tokenize-quote s demi)
+     (and
+      (eqv? (string-ref s 0) demi)
+      (let loop ((start 1))
+        (let1 pos (string-index s demi start)
+          (cond ((and pos
+                      (eqv? (string-ref s (+ pos 1) #f)
+                            demi))
+                 (loop (+ pos 2)))
+                (else
+                 (and pos
+                      (cons (substring s 1 pos)
+                            (substring/shared s (+ pos 1))))))))))
+
    (define (scan-string s r)
!     (cond ((tokenize-quote s #?')
             => (lambda (m)
!                 (entry (cdr m)
!                        (cons `(string ,(regexp-replace-all #/''/ (car m) "'"))
                               r))))
            (else
             (e "unterminated string literal in SQL: ~s" sql-string))))
    (define (scan-delimited s r)
!     (cond ((tokenize-quote s #?")
             => (lambda (m)
!                 (entry (cdr m)
!                        (cons `(delimited ,(regexp-replace-all #/""/ (car m) "?""))
                               r))))
            (else
             (e "unterminated delimited identifier in SQL: ~s" sql-string))))

dbm.qdbmのdbm-delete!(Gauche-qdbm-0.2)

(2006/01/16 04:34:09 PST) GaucheRefj:dbm-delete!では、値が存在しない場合は何もしないという事になってますが、qdbmでは、エラー例外を投げるようになっています(gdbmやfsdbmではエラー例外は投げないです)。 どこに書けばいいのか分からないので、ここに書きます……。

--- qdbm.scm.orig       2005-11-15 05:12:20.000000000 +0900
+++ qdbm.scm    2005-11-15 05:12:39.000000000 +0900
@@ -121,8 +121,7 @@
 
 (define-method dbm-delete! ((self <qdbm>) key)
   (next-method)
-  (unless (qdbm-dpout (qdbm-file-of self) (%dbm-k2s self key))
-    (errorf "dbm-delete!: deleteting key ~s from ~s failed" key self)))
+  (qdbm-dpout (qdbm-file-of self) (%dbm-k2s self key)))
 
 ;;
 ;; Iterations

それから、Gauche-0.8.6のdbm.scmに文言ミスがありました。

--- lib/dbm.scm.orig    2006-01-16 21:03:18.000000000 +0900
+++ lib/dbm.scm 2006-01-16 21:03:23.000000000 +0900
@@ -145,7 +145,7 @@
 (define-method dbm-delete! ((dbm <dbm>) key)
   (when (dbm-closed? dbm) (errorf "dbm-delete!: dbm already closed: ~s" dbm))
   (when (eqv? (slot-ref dbm 'rw-mode) :read)
-    (errorf "dbm-put!: dbm is read only: ~s" dbm)))
+    (errorf "dbm-delete!: dbm is read only: ~s" dbm)))

 (define-method dbm-fold ((dbm <dbm>) proc knil) #f)

SCM_VECTOR_FOR_EACHオーバーラン

(2006/01/05 19:26:04 PST): 下記のコンパイラへのパッチを試していて気づきました。

Index: src/gauche.h
===================================================================
RCS file: /cvsroot/gauche/Gauche/src/gauche.h,v
retrieving revision 1.442
diff -u -r1.442 gauche.h
--- src/gauche.h        13 Oct 2005 08:14:13 -0000      1.442
+++ src/gauche.h        6 Jan 2006 03:19:17 -0000
@@ -1262,7 +1262,7 @@
 #define SCM_VECTOR_FOR_EACH(cnt, obj, vec)           ?
     for (cnt = 0, obj = SCM_VECTOR_ELEMENT(vec, 0);  ?
          cnt < SCM_VECTOR_SIZE(vec);                 ?
-         obj = SCM_VECTOR_ELEMENT(vec, ++cnt)) 
+         (++cnt < SCM_VECTOR_SIZE(vec)) && (obj = SCM_VECTOR_ELEMENT(vec, cnt))) 
 
 /*--------------------------------------------------------
  * PORT

元のコードだと、elementsのひとつ後ろを参照してしまうため、SEGVを喰らうことがあります。具体的には、NetBSD 3.0 RELEASE上で、下記コンパイラパッチ+拙作NetBSDネイティブスレッドパッチを適用した状態で、make checkでtest/hash.scm実行中にSEGVを喰らいます。このパッチはチェックが二重に行うのがかなりいやな感じですが、うまい方法が思い浮かびませんでした。

マニュアルにunquoteとunquote-splicingがのっていない(0.8.6)

2005/12/31 07:38:17 PST

map-to, map-to-with-index (0.8.6)

2005/12/22 02:28:25 PST

最初のシーケンスの長さが他のシーケンスの長さより長いときに <vector> などにマップすると出力がおかしくなります.

gosh> (map-to <vector> + '(1 2 3) '(4 5))
#(5 7 #<undef>)
gosh> (map-to-with-index <vector> + '(1 2 3) '(4 5))
#(5 8 #<undef>)

マニュアルを読む限り,バグだと思うので.

--- collection.scm.orig 2005-12-22 18:58:43.475640847 +0900
+++ collection.scm      2005-12-22 18:59:05.622545468 +0900
@@ -265,7 +265,7 @@
           (do ()
               ((end?) (get))
             (add! (proc (next))))))
-      (with-builder (class add! get :size (size-of coll))
+      (with-builder (class add! get)
         (call-with-iterators
          (cons coll more)
          (lambda (ends? nexts)
--- sequence.scm.orig   2005-12-22 18:59:19.323630505 +0900
+++ sequence.scm        2005-12-22 19:01:55.252835586 +0900
@@ -169,7 +169,7 @@
           (do ((i 0   (+ i 1)))
               ((end?) (get))
             (add! (proc i (next))))))
-      (with-builder (class add! get :size (size-of seq))
+      (with-builder (class add! get)
         (call-with-iterators
          (cons seq more)
          (lambda (ends? nexts)

util.stream (0.8.6)

2005/12/21 03:13:15 PST

修正し忘れだと思いますが,->stream-char と write-stream で let-optionals* にアスタリスクがついてません.

--- stream.scm.orig     2005-12-21 19:46:06.376819422 +0900
+++ stream.scm  2005-12-21 19:47:09.128073356 +0900
@@ -633,7 +633,7 @@
  
 (define (->stream-char obj . rest)
   (stream-delay
-   (let-optionals rest ((tail stream-null))
+   (let-optionals* rest ((tail stream-null))
      (cond
       ((string? obj) (string->stream obj tail))
       ((or (number? obj) (boolean? obj) (symbol? obj)) (->stream-char (->string obj) tail))
@@ -657,7 +657,7 @@
   (stream-map (lambda (c) (if (equal? c from) to c)) str))
  
 (define (write-stream stream . rest)
-  (let-optionals rest ((port (current-output-port)) (writer write-char))
+  (let-optionals* rest ((port (current-output-port)) (writer write-char))
     (let loop ((s stream))
       (unless (stream-null? s)
         (writer (stream-car s) port)

stream-remove (0.8.6)

2005/12/20 04:11:44 PST

complement がないです.

gosh> (stream-remove odd? (stream 1 2 3))
*** ERROR: unbound variable: complement
Stack Trace:
--- stream.scm.orig     2005-12-20 20:09:15.183441387 +0900
+++ stream.scm  2005-12-20 20:10:14.212204539 +0900
@@ -523,7 +523,7 @@
 ;;; Filtering & Partitioning
  
 (define (stream-remove pred str)
-  (stream-filter (complement pred) str))
+  (stream-filter (compose not pred) str))
  
 ; The following version is faster than the current but has the problem of
 ; eagerly evaluating the streams rather than create them as they are

Inlining(?) で compile error (0.8.4, 0.8.6)

2005/12/19 00:12:18 PST

Top level でない関数三つを相互に呼び出させると、compile に失敗します。

$ cat
(define (rename)

  (define (canonicalize func-name)
    (regexp-fold
     func-name
     ))

  (define (regexp-fold str)
    str)

  (define (map-ident str)
    (canonicalize str))

  (let loop ())
  )
jun@debian /dvl/uim/org/branches/r5rs/sigscheme
$ gosh -V
Gauche scheme interpreter, version 0.8.4 [utf-8,pthreads]
jun@debian /dvl/uim/org/branches/r5rs/sigscheme
$ gosh rename-functions.scm
*** ERROR: Compile Error: [internal error] stray local variable:
"./rename-functions.scm":1:(define (rename) (define (canonicali ...

Stack Trace:
_______________________________________

text/sql 大文字のテーブル名が使えない (0.8.6)

2005/12/17 21:10:41 PST

--- sql.orig.scm        2005-12-18 13:45:12.000000000 +0900
+++ sql.scm     2005-12-18 13:46:27.000000000 +0900
@@ -160,7 +160,7 @@
            ((#/^?w+/ s)
             => (lambda (m)
                  (entry (m 'after)
-                        (cons (string->symbol (string-downcase (m))) r))))
+                        (cons (string->symbol (m)) r))))
            (else (e "invalid SQL token beginning with ~s in: ~s"
                     c sql-string)))))))
   ;;

大文字のテーブル名も小文字に変換されてしまってエラーになるので。 お願いします。

マニュアル file-filter (0.8.6)

2005/12/14

$ diff -u modutil.texi.orig modutil.texi
--- modutil.texi.orig   2005-12-14 19:39:01.543372191 +0900
+++ modutil.texi        2005-12-14 19:39:52.134326005 +0900
@@ -1961,7 +1961,7 @@
 is passed to @var{proc}.  This port is closed when @var{proc} returns.
 If this argument is omitted, the current output port is passed.
 @c JP
-この引数は入力ポートかファイル名を示す文字列でなければなりません。
+この引数は出力ポートかファイル名を示す文字列でなければなりません。
 出力ポートの場合、それはそのまま@var{proc}に渡されます。
 文字列が渡された場合は、そのファイル名を持つファイルを出力用にオープンし、
 そのポートが@var{proc}に渡されます (但し、@var{temporary-file}

Gauche ユーザリファレンスを見ているのですが、[1.1 Gaucheの概要]が見えません

a-san?(2005-12-01) http://www.shiro.dreamhost.com/scheme/gauche/man/gauche-refj_2.html#SEC2 IEでも、FireFoxでも同じです。 調べてみると、HTMLの先頭に文字コードを識別するための EF BB BF がありません。 おそらく、HTML作成後、テキストエディタで編集したため、誤って先頭の識別コードを 削ってしまったと思われます。 [snip]

マニュアル (byte-ready?)

gauche.vportのセクションでbyte-ready?手続きに言及していますが、byte-ready?の説明がどこにもないようです。

modestなportをpeekした後にreadすると、ブロックしてしまう場合がある(-0.8.6)

(2005/11/27 09:56:12 PST)

socket-input-portを:buffering :modestで取得し、通信先から少しだけデータを送り、 peek-byteで少し覗いてから、充分に大きい範囲に対してread-blockしようとすると、 bufferingを:modestにしていても、ブロックしてしまいます。 bufferingを:noneにするか、:modestでもpeek-byteしなければ、ブロックせずに、 予想した通りに動作します。

このパッチで、:modest時にpeekしても、予想通りに動作するようになったのを 確認しましたが、本当に正しく直せたか、他の部分に影響が無いか、自信が無いです。

--- src/port.c.orig     2005-11-28 01:23:09.000000000 +0900
+++ src/port.c  2005-11-28 02:59:31.000000000 +0900
@@ -574,6 +574,12 @@
         dst += req;
     }
     while (siz > 0) {
+        if (nread && (p->src.buf.mode != SCM_PORT_BUFFER_FULL)) {
+            if (p->src.buf.ready
+                && p->src.buf.ready(p) == SCM_FD_WOULDBLOCK) {
+                break;
+            }
+        }
         req = MIN(siz, p->src.buf.size);
         r = bufport_fill(p, req, TRUE);
         if (r <= 0) break; /* EOF or an error*/
@@ -591,10 +597,6 @@
         }
         if (p->src.buf.mode != SCM_PORT_BUFFER_FULL) {
             if (r < req) break;
-            if (p->src.buf.ready
-                && p->src.buf.ready(p) == SCM_FD_WOULDBLOCK) {
-                break;
-            }
         }
     }
     return nread;

relation-rowsが使えない(0.8.6)

2005/11/23 23:21:25 PST

util.relationのrelation-rowsが、exportされてなくて使えないようです。

(Trivial) INSTALL に、デフォルトがEJC-JPと書いてある。 (0.8.6)

2005/11/20 06:48:13 PST

http://www.shiro.dreamhost.com/scheme/gauche/index-j.html

との事ですが…。

stream-filter が変? (0.8.6)

2005/11/18 02:14:11 PST

gosh> (use util.stream)
#<undef>
gosh> (stream->list (stream-iota 5))
(0 1 2 3 4)
gosh> (stream-car (stream-filter even? (stream-iota 5)))
0
gosh> (stream->list (stream-filter even? (stream-iota 5)))
*** ERROR: pair required, but got ()
[...]

get_string_from_body 内で SEGV (-0.8.6)

2005/11/16 05:18:32 PST:

scmail の scbayes でデータベースの更新をしたら SEGV しました。scbayes の101,102行目のどちらかをコメントアウトすれば SEGV しません。バックトレースはこんな感じでした

(gdb) bt
#0  get_string_from_body (b=0x855c5d8) at string.c:244
#1  0x4006c62e in Scm_PutsUnsafe (s=0x855c5d0, p=0x848a770) at portapi.c:202
#2  0x40068e72 in Scm_Puts (s=0x855c5d0, p=0x848a770) at portapi.c:220
#3  0x40064449 in string_print (obj=0x855c5d8, port=0x848a770, ctx=0x856e000) at string.c:1195
#4  0x40070df1 in write_general (obj=0x855c5d0, out=0x848a770, ctx=0xbfffe920) at write.c:274
#5  0x40071788 in write_ss_rec (obj=0x855c5d0, port=0x848a770, ctx=0xbfffe920) at write.c:536
#6  0x4007078e in Scm_Write (obj=0x855c5d0, p=0x0, mode=0) at write.c:166
#7  0x40098cc4 in stdlib_display (SCM_FP=0x855c5d0, SCM_ARGCNT=139911168, data_=0x0) at stdlib.c:3940
#8  0x4004de8f in run_loop () at vm.c:880
#9  0x4004fbfc in user_eval_inner (program=0x400f9960, codevec=0x8498440) at vm.c:2869
#10 0x08049ecd in main (argc=4, argv=0xbfffeeb4) at main.c:411

BIGNUM / 0 を実行すると暴走する(-0.8.6)

2005/11/10 08:00:05 PST:

(/ (expt 10 10) 0)

を実行すると

WARNING: Signal queue overflow

をひたすら表示して暴走する。

WindowsMe上でエラー。(-0.8.6)

(2005/11/07 06:34:05 PST):

WindowsMe上で起動時にエラーメッセージが出て終了します。

Goshが原因で LIBGAUCHE.DLL にエラーが発生しました。Gosh は終了します。
問題が解決しない場合は、コンピュータを再起動してください。

WindowsMeではNetApiBufferFreeが使えませんので、getpwnamは常にNULLを返すように弄ってます。 それ以外はそのままconfigureとmakeしただけです。 configureにもmakeにもオプションはつけませんでした。 WindowsMeはWindowsの中で特に不安定で知られるものだけに、環境の問題なのかバグの顕在化なのかはわかりません。 printfをちりばめる原始的な確認ではScm_Init_scmlib関数の中のどこかで異常が起きているらしく思われます。 WindowsMe環境をお持ちの方は追試験して頂けたらと思います。 因みにここでエラー発生したバイナリをそのままWindowsXP上で動かすと正常に機能しているようです。 曖昧な情報で申し訳ないですが、WindowsMeユーザーは少ないと思われますのでまずは報告させて頂いた次第です。

closeされたsocketのportに読み書きすると、assertionが発生する (-0.8.6)

(2005/11/02 03:59:13 PST):

(use gauche.net)
(define s (make-client-socket (make <sockaddr-in> :host "127.0.0.1" :port 80)))
(socket-close s)
(port-closed? (socket-input-port s))
(read-line (socket-input-port s))

で、

"port.c", line 792 (file_flusher): Assertion failed: fd >= 0

でgoshが終了してしまいます。

gauche.listener (-0.8.6)

read-blockしているところでは、それが失敗する可能性に対応する必要があると思います。read-blockの失敗でプログラムが終了してしまいまったので。

RCS file: /cvsroot/gauche/Gauche/lib/gauche/listener.scm,v
retrieving revision 1.6
diff -u -r1.6 listener.scm
--- lib/gauche/listener.scm     30 Jan 2004 20:20:27 -0000      1.6
+++ lib/gauche/listener.scm     2 Nov 2005 07:14:22 -0000
@@ -104,15 +104,18 @@
                  (listener-show-prompt self)))
              (set! (ref self 'rbuf) (port->string (current-input-port)))))
          (repl)))))
-
+  (define (finalize)
+    (cond ((ref self 'finalizer) => (lambda (f) (f)))))
+
   (lambda ()
-    (let ((chunk (read-block 8192 (ref self 'input-port))))
+    (and-let* ((chunk (guard (e ((<system-error> e) (finalize) #f))
+                        (read-block 8192 (ref self 'input-port)))))
       (if (eof-object? chunk)
-          (cond ((ref self 'finalizer) => (lambda (f) (f))))
-          (begin
-            (update! (ref self 'rbuf) (cut string-append <> chunk))
-            (string-incomplete->complete! (ref self 'rbuf))
-            (with-error-to-port (ref self 'error-port) repl)))))
+        (finalize)
+        (begin
+          (update! (ref self 'rbuf) (cut string-append <> chunk))
+          (string-incomplete->complete! (ref self 'rbuf))
+          (with-error-to-port (ref self 'error-port) repl)))))
   )

 ;; Check if the given string can be parsed as a complete sexp.

Last modified : 2012/02/23 03:06:33 UTC