Gauche:Bugs:log14
Gauche 0.9.1以前のバグ
- リファレンスマニュアルのtypo (r7267)
- OpenGLのバグ?(0.9)
- sxpathにXPathで使用する名前空間の連想リストを渡すとエラーになる (r7203)
- sxpathでXPathのcontains関数の引数が逆になっている (r7202)
- with-signal-handlers sets unwanted signals to be ignored
- dynamic-wind で stray local variable (r7093)
- match-let*がエラーになる(0.9)
- gauche.testモジュールのtest-record-file関数を呼ぶとエラーになる(0.9)
- http-getにおいて、手続きにより解釈されるキーワード引数がメッセージのヘッダにも現れてしまう(0.9)
- doc/modsrfi.texiのtypo (trunk)
- peek-char などで先読みすると、port-seek,port-tell の位置がずれる(0.9)
- 同じフォーマット文字列でpack,unpackしても元に戻らない(0.9)
- 存在していない「~$」というシンボルがexportされている?(0.9)
リファレンスマニュアルの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
- Shiro (2010/12/02 00:06:53 PST): 反映しました。ありがとうございます。
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行の文字列なら問題なく表示されました。
- Shiro(2010/11/06 04:32:17 PDT): うーん、特におかしなところは見当たらないし、
私の環境では正常に表示されます。
PCの画面表示自体を道連れにするってことは、Gaucheのレイヤよりもずっと下、
ディスプレイドライバあたりの問題のような気もしますが。
うちの環境:
- Ubuntu 10.04
- libglut3, libglut3-dev
- NVidia driver v173
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))))) ;==============================================================================
- Shiro(2010/10/15 09:02:29 PDT): ありがとうございます。修正しました。
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
- Shiro(2010/10/07 01:17:15 PDT): 新しいsxml-toolsはかなり機能強化されてるみたいですね。 できれば新しいのに置き換えたいところですが、動作検証してると長くかかりそうなので、 上のfixいただきます。
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>",
- Shiro(2010/09/05 02:32:10 PDT): 「Gaucheがアプリケーションのシグナルハンドラを
置き換えていない」ことを示す値として、nilでなく#<undef>を使うことにしました。
また、一度でもGaucheがシグナルハンドラを置き換えた場合 (手続き、#t、#fを
set-signal-handler!に渡した場合)、それをアプリケーションの元々の
シグナルハンドラに戻す方法は無いので、#<undef>をset-signal-handler!が
受け取った場合は何もせずに戻るようにしています。sigHandlers.handlers[]を
変更してしまうとシステムのハンドラとsigHandlers.handlers[]の状態に齟齬が
生じてしまうので。
後者については、最初にsigactionした時にオリジナルのハンドラをどこかに 保存しておくことで戻すことが可能になりますが、そういうことが必要かどうか わからないのでペンディングとしておきます。必要になったらやるってことで。
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))
- Shiro(2010/04/11 20:52:32 PDT): オプティマイザのバグでした。fixed (r7094).
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*. を定義し忘れているようです。
- Shiro(2010/03/22 07:59:46 PDT): 直しました。
gauche.testモジュールのtest-record-file関数を呼ぶとエラーになる(0.9)
(2010/03/11 21:42:27 PST): 引数のtypoみたいです。
- Shiro(2010/03/12 02:50:21 PST): 直しました。
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>
- Shiro(2010/02/21 03:40:57 PST): 直しました。アドホックな対応なので漏れがあるかも。
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} の要素を削除した結果 です。
- Shiro(2010/02/21 03:40:57 PST): 直しました。
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>
- Shiro(2009/12/25 20:09:52 PST): 内部的には「一度読んでpush back」しちゃってるので、
どうしようか悩んでるんですが、peek-charのセマンティクスからすれば動くべきでは
ないですね。
portの抽象は高レイヤと低レイヤが混ざっててあまりうまくないです。 peek-charは本来高レイヤの方、port-tellやport-seekは低レイヤ、で 分けるといいと思うのですけれどね。
とりあえずpeek-charについてはアドホックな対応でしのごうと思います。
同じフォーマット文字列で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)
- teranishi(2009/12/15 15:15:04 PST): 最初はパッチを上げていたのですが、文字数とバイト数が異なる場合を考慮していなかったので、いったんパッチを取り下げます。
- teranishi(2009/12/16 04:26:23 PST): 他にも問題が出ているので(下記参照)、私では直せそうにないです。すみません。
gosh> (unpack "A3C" :from-string (pack "A3C" '("a b" 33) :to-string? #t)) ("a" 98) gosh> (unpack "A3C" :from-string (pack "A3C" '("日" 33) :to-string? #t)) ("日" 32)
- Shiro(2009/12/17 09:23:56 PST): packは他にも'@'の扱いで問題が残ってたりするので、 近々書き直してしまおうとは思っています。
存在していない「~$」というシンボルがexportされている?(0.9)
nekoie (2009/11/26 16:13:20 PST): ./lib/gauche/procedure.scm と ./src/autoloads.scm の二箇所で、「~$」というシンボルをexport/autoloadしようとしているようですが、実体が存在していないようです。
- Shiro(2009/11/28 01:47:32 PST): ああ、すっかり忘れてた。これ、確か、 complementの別名にしようと思ったんだけど (arcが ~proc で (complement proc) の意味にしてたので)、'~' をrefに使うつもりなので紛らわしいかと考え直した んだった。とりあえず消しときます。complementの短い別名は欲しいんですけどね。