Gauche 0.9.1以前のバグ
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
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行の文字列なら問題なく表示されました。
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))))) ;==============================================================================
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 を呼ぶと、それまで 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>",
齊藤 (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))
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*. を定義し忘れているようです。
(2010/03/11 21:42:27 PST): 引数のtypoみたいです。
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>
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} の要素を削除した結果 です。
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>
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)
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)
nekoie (2009/11/26 16:13:20 PST): ./lib/gauche/procedure.scm と ./src/autoloads.scm の二箇所で、「~$」というシンボルをexport/autoloadしようとしているようですが、実体が存在していないようです。