Gauche:Bugs:log14

Gauche:Bugs:log14

Gauche 0.9.1以前のバグ


リファレンスマニュアルのtypo (r7267)

teppey (2010/11/30 07:05:13 PST): いくつかありました。

Index: modutil.texi
===================================================================
--- modutil.texi        (リビジョン 7267)
+++ modutil.texi        (作業コピー)
@@ -6568,10 +6568,10 @@
 @c COMMON
 
 @c EN
-The keyword argument @var{log-draion} is set to the created
+The keyword argument @var{log-drain} is set to the created
 ftp connection's @code{log-drain} slot.
 @c JP
-キーワード引数@var{log-draion}が生成したFTPコネクションの
+キーワード引数@var{log-drain}が生成したFTPコネクションの
 @code{log-drain}スロットに設定されます。
 @c COMMON
 @end defun
Index: corelib.texi
===================================================================
--- corelib.texi        (リビジョン 7267)
+++ corelib.texi        (作業コピー)
@@ -7955,7 +7955,7 @@
 テスト式においては、投げられたコンディションのタイプをチェックする
 のが普通です。@code{condition-has-type?} という関数が
 SRFI-35 で定義されていますが、これはちょっと冗長です。Gauche の
-コンディションクラスは述語のようも使えるようになっており、上の
+コンディションクラスは述語のようにも使えるようになっており、上の
 式は以下のように書くこともができます。
 @c COMMON
 
@@ -9002,7 +9002,7 @@
 合成コンディションを使わなければなりません。Gauche は
 主として過去のバージョンとの互換性を確保するために、
 ここで多重継承を用いています。
-可搬性のあるコードを掛くには、以下のようにメッセージコンディション
+可搬性のあるコードを書くには、以下のようにメッセージコンディション
 付きのエラーコンディションを使うべきです。
 @c COMMON
 
Index: modgauche.texi
===================================================================
--- modgauche.texi      (リビジョン 7267)
+++ modgauche.texi      (作業コピー)
@@ -14692,7 +14692,7 @@
 It has the following instance slots.
 You have to set at least @code{flush} slot.
 @c JP
-このクラスのインスタンスは出力ポートして振舞います。これは、以下のような
+このクラスのインスタンスは出力ポートとして振舞います。これは、以下のような
 インスタンススロットを持ちます。少くとも @code{flush} は設定しなければ
 なりません。
 @c COMMON

OpenGLのバグ?(0.9)

nao-ichiro(2010/11/06 02:08:48 PDT)勉強不足で何を書けば良いのかよく分からないので、コードを丸投げします(放っておくよりはマシかと思いましたので)。OpenGLで文字列を表示させるための以下のようなコードを実行したところ、PC自体の画面表示が狂って再起不能になりました。Ubuntu10.04です。

(use gl)
(use gl.glut)


(define *width* 500)
(define *height* 500)

(define (pixel->relative-w p)
  (/ (* 2 p) *width*))
(define (pixel->relative-h p)
  (/ (* 2 p) *height*))

(define (print-s x y str)
  (define (print-c-loop xx yy c-l)
    (if (null? c-l)
        '()
        (let ((c (car c-l)))
          (if (char=? c #\newline)
              (print-c-loop x 
                            (- yy (pixel->relative-h 15))
                            (cdr c-l))
              (begin 
                (gl-raster-pos xx yy 0 1)
                (glut-bitmap-character GLUT_BITMAP_9_BY_15
                                       (char->integer c))
                (print-c-loop (+ xx (pixel->relative-w 9)) 
                              yy
                              (cdr c-l)))))))
  (print-c-loop x y (string->list str)))

(define (disp)
  (gl-clear GL_COLOR_BUFFER_BIT)

  (print-s -0.9 0.9 
"I read a news today, ah boy
About a lucky man who made the grade
And though the news was rather sad
Well, I just had to laugh, ah
I saw the photograph, ah
He blew his mind out in the car
He didn't notice that the light had changed
A croud of people stood and stared
They've seen his face before
But nobody was really sure if he was from the
House of Lords"
  )
  (gl-flush)
)

(define (main args)
  (glut-init args)
  (glut-init-window-position 100 50)
  (glut-init-window-size *width* *height*)
  (glut-init-display-mode (logior GLUT_RGBA GLUT_SINGLE))

  (glut-create-window "test")
  (glut-display-func disp)

  (glut-main-loop)
  0
)

文字列が大きくなると、バグってしまうようでした。3~4行の文字列なら問題なく表示されました。

sxpathにXPathで使用する名前空間の連想リストを渡すとエラーになる (r7203)

teppey (2010/10/15 08:05:05 PDT): SXML Tools Tutorialによると、sxpathのXPath記法において接頭辞付きの名前を使う場合、SXML側との対応を連想リストで渡す必要がありますが、エラーになります。

gosh> (use sxml.sxpath)
#<undef>
gosh> (define sxml '(*TOP* (rss:title "foo")))
sxml
gosh> (define alist '((my . "rss")))
alist
gosh> ((sxpath "//my:title" alist) sxml)

XPointer parser error: unknown namespace prefix - my
*** ERROR: invalid application: (#f (*TOP* (rss:title "foo")))
Stack Trace:
_______________________________________

sxml-toolsのCVSではRevision1.2で修正されているので、同様の修正を加えるのはどうでしょうか。

Index: ext/sxml/src/sxpath.scm
===================================================================
--- ext/sxml/src/sxpath.scm     (リビジョン 7203)
+++ ext/sxml/src/sxpath.scm     (作業コピー)
@@ -34,6 +34,7 @@
 ; (sxpathr number)      -> (node-pos number)
 ; (sxpathr path-filter) -> (filter (sxpath path-filter))
 (define (sxpath path . ns-binding)
+  (let ((ns-binding (if (null? ns-binding) ns-binding (car ns-binding))))
   (let loop ((converters '())
              (root-vars '())
              (path (if (string? path) (list path) path)))
@@ -158,7 +159,7 @@
                 filters))))))))
       (else
        (cerr "Invalid path step: " (car path))
-       #f))))
+       #f)))))
 
 
 ;==============================================================================

sxpathでXPathのcontains関数の引数が逆になっている (r7202)

teppey (2010/10/06 17:46:41 PDT): sxpathには文字列でXPathを渡すことができますが、contains関数の引数の順序が逆になっています。 以下のコードではxpath1とxpath2の結果は逆になるべきだと思います。 参考: http://www.w3.org/TR/1999/REC-xpath-19991116/#function-contains

(use sxml.sxpath)
(define sxml '(*TOP* (html (p (@ (class "hello")) "bar"))))
(define xpath1 "//p[contains(@class, 'el')]")
(define xpath2 "//p[contains('el', @class)]")

((sxpath xpath1) sxml) ; => ()
((sxpath xpath2) sxml) ; => (p (@class "foo") "bar")

SXMLのCVS上ではtxpath.scmのRevision1.7で修正されているのですが、これをext/sxml/srcに入れてビルドしてもテストで失敗してしまいました。以下のように ext/sxml/src/txpath.scmを直接書き換えちゃうのはまずいでしょうか。

Index: ext/sxml/src/txpath.scm
===================================================================
--- ext/sxml/src/txpath.scm>    (リビジョン 7202)
+++ ext/sxml/src/txpath.scm>    (作業コピー) 
@@ -1023,7 +1023,7 @@
                            (func1 nodeset root-node context var-binding)))
                     (str2 (sxml:string
                            (func2 nodeset root-node context var-binding))))
-                (if (substring? str1 str2) #t #f)))  ; must return a boolean
+                (if (substring? str2 str1) #t #f)))  ; must return a boolean
             path
             index-required))))
        ((equal? name "substring-before")  ; it is a SUBSTRING-BEFORE function

with-signal-handlers sets unwanted signals to be ignored

with-signal-handlers を呼ぶと、それまで SIG_IGN でなかったものが そうなってしまいます。 例えば、(info 'car) を kterm などで実行している gosh から呼ぶと、 その後 C-z によるサスペンドができなくなります (on NetBSD/amd64 at least)

sigHandlers.handlers[] の状態として、libgauche が扱わないシグナルについては nil であらわすことにしました。その状態を user に見せるかどうかは議論の 余地がありそうですが、ここでは見せることにしています。

enami (2010/08/26 19:48:04 PDT):

diff --git a/src/signal.c b/src/signal.c
index bb87a96..93ac0a1 100644
--- a/src/signal.c
+++ b/src/signal.c
@@ -581,5 +581,5 @@ ScmObj Scm_SetSignalHandler(ScmObj sigs, ScmObj handler, ScmSysSigset *mask)
     struct sigdesc *desc;
     sigset_t sigset;
-    int badproc = FALSE, sigactionfailed = FALSE;
+    int badproc = FALSE, sigactionfailed = FALSE, donthandle = FALSE;
 
     if (SCM_INTP(sigs)) {
@@ -596,11 +596,4 @@ ScmObj Scm_SetSignalHandler(ScmObj sigs, ScmObj handler, ScmSysSigset *mask)
     }
 
-    if (mask == NULL) {
-        /* If no mask is specified, block singals in SIGS. */
-        mask = make_sigset();
-        mask->set = sigset;
-    }
-    
-    (void)SCM_INTERNAL_MUTEX_LOCK(sigHandlers.mutex);
     if (SCM_TRUEP(handler)) {
         act.sa_handler = SIG_DFL;
@@ -610,7 +603,17 @@ ScmObj Scm_SetSignalHandler(ScmObj sigs, ScmObj handler, ScmSysSigset *mask)
                && SCM_PROCEDURE_TAKE_NARG_P(handler, 1)) {
         act.sa_handler = sig_handle;
+    } else if (SCM_NULLP(handler)) {
+        donthandle = TRUE;
     } else {
         badproc = TRUE;
     }
+
+    if (mask == NULL && !donthandle) {
+        /* If no mask is specified, block singals in SIGS. */
+        mask = make_sigset();
+        mask->set = sigset;
+    }
+    
+    (void)SCM_INTERNAL_MUTEX_LOCK(sigHandlers.mutex);
     if (!badproc) {
         sigfillset(&act.sa_mask); /* we should block all the signals */
@@ -619,5 +622,5 @@ ScmObj Scm_SetSignalHandler(ScmObj sigs, ScmObj handler, ScmSysSigset *mask)
             if (!sigismember(&sigset, desc->num)) continue;
             if (!sigismember(&sigHandlers.masterSigset, desc->num)) continue;
-            if (sigaction(desc->num, &act, NULL) != 0) {
+            if (!donthandle && sigaction(desc->num, &act, NULL) != 0) {
                 sigactionfailed = desc->num;
             } else {
@@ -956,5 +959,5 @@ void Scm__InitSignal(void)
     (void)SCM_INTERNAL_MUTEX_INIT(sigHandlers.mutex);
     sigemptyset(&sigHandlers.masterSigset);
-    for (i=0; i<NSIG; i++) sigHandlers.handlers[i] = SCM_FALSE;
+    for (i=0; i<NSIG; i++) sigHandlers.handlers[i] = SCM_NIL;
     
     Scm_InitStaticClass(&Scm_SysSigsetClass, "<sys-sigset>",

dynamic-wind で stray local variable (r7093)

齊藤 (2010/04/10 18:40:14 PDT): 以下のようなケースでコンパイルエラーになりました。

(define a 1)
(let ((lv (lambda () (set! a 2))))
  (dynamic-wind lv (lambda () 'hoge) lv))
*** ERROR: Compile Error: [internal error] stray local variable:
"(stdin)":2:(let ((lv (lambda () (set! a 2)))) ( ...

Stack Trace:
_______________________________________

何故か before と after が違う場合 (↓) にはエラーにはなりませんでした。

(define a 1)
(let ((lv (lambda () (set! a 2)))
      (lv2 (lambda () (set! a 2))))
  (dynamic-wind lv (lambda () 'hoge) lv2))

match-let*がエラーになる(0.9)

teranishi (2010/03/22 06:19:09 PDT): 以下の実行例で、match-let*がエラーを返します。

gosh> (use util.match)
#<undef>
gosh> (match-let* ((x 1)) x)
*** ERROR: Compile Error: unbound variable: match-let*.
"(stdin)":2:(match-let* ((x 1)) x)

Stack Trace:
_______________________________________

libsrc/util/match.scm で match-let*. を定義し忘れているようです。

gauche.testモジュールのtest-record-file関数を呼ぶとエラーになる(0.9)

(2010/03/11 21:42:27 PST): 引数のtypoみたいです。

http-getにおいて、手続きにより解釈されるキーワード引数がメッセージのヘッダにも現れてしまう(0.9)

shibuya 2010/02/20 19:11:22 PST: リファレンスマニュアルの例を実行して、プロトコルアナライザでキャプチャしました。

(use rfc.http)
(call-with-output-file "page.html"
  (lambda (out)
    (http-get "www.schemers.org" "/"
              :sink out :flusher (lambda _ #t))))
GET / HTTP/1.1
Host: www.schemers.org
user-agent: gauche.http/0.9
flusher: #<closure (#f #f)>
sink: #<oport page.html 0x5547b8>

doc/modsrfi.texiのtypo (trunk)

teppey (2010/01/07 07:44:57 PST): partitionの部分です。

Index: doc/modsrfi.texi
===================================================================
--- doc/modsrfi.texi    (revision 6993)
+++ doc/modsrfi.texi    (working copy)
@@ -974,7 +974,7 @@
 @var{list} by @var{pred}, and the second is the result of
 removing elements of @var{list} by @var{pred}.
 @c JP
-[SRFI-1] @code{filter} と @code{remove} は同時に、すなわち2つのリストを
+[SRFI-1] @code{filter} と @code{remove} を同時に、すなわち2つのリストを
 返しますが、一つ目は @var{pred} により @var{list} の要素をフィルタリング
 した結果で、二つ目は @var{pred} により @var{list} の要素を削除した結果
 です。

peek-char などで先読みすると、port-seek,port-tell の位置がずれる(0.9)

teranishi (2009/12/25 16:00:18 PST): 以下の実行例で、peek-char の前後で port-tell の結果が異なります。

gosh> (call-with-input-string "abcd" (lambda (port) (print (port-tell port)) (peek-char port) (print (port-tell port))))
0
1
#<undef>

同じフォーマット文字列でpack,unpackしても元に戻らない(0.9)

teranishi (2009/12/15 06:45:47 PST): 以下の実行例で、同じフォーマット文字列でpack,unpackしているにもかかわらず元の値に戻りません。(文字コードはUTF-8)

gosh> (use binary.pack)
#<undef>
gosh> (unpack "AC" :from-string (pack "AC" '("1" 128) :to-string? #t))
("1" 194)
gosh> (unpack "A2C" :from-string (pack "A2C" '("" 33) :to-string? #t))
("" 32)

存在していない「~$」というシンボルがexportされている?(0.9)

nekoie (2009/11/26 16:13:20 PST): ./lib/gauche/procedure.scm と ./src/autoloads.scm の二箇所で、「~$」というシンボルをexport/autoloadしようとしているようですが、実体が存在していないようです。

More ...