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しようとしているようですが、実体が存在していないようです。