Gauche:Bugs:log5
最新のもの: Gauche:Bugs
- regexp-compile (0.8.5)
- dbd.pg:151行目 (0.8.6_pre3 CVS HEAD 2005/11/01 01:49:09 PST)
- www.cgiで、with-output-to-string等の中でエラーが発生した時にエラー画面が出力されない(0.8.5)
- 正規表現の optimize に失敗する(0.8.5)
- regexp-compile で wb, nwb が使えない (0.8.5)
- sys-dirname、sys-basenameに失敗(0.8.5, sjis)
- string-prefix-lengthの挙動が変?(0.8.5)
- port->stringで、バイナリ文字列も読み取ってほしい (0.8.5,euc-jp)
- sandbox環境からのautoloadが失敗する (0.8.5)
- ドキュメントに report-error 手続きのエントリがない
- CVS HEAD: 大きな実数へのinteger?
- directory-list (build-path) で error(0.8.5)
- named letの解析に失敗(0.8.5+FreeBSD-4.11)
- socket-status (0.8.6-pre2)
- CVS HEAD: exportされていないシンボルがモジュール外から見えている
- SRFI-19 string->date
- CVS HEAD: <mersenne-twister>の:seed引数
- ext/net/netlib.stub(1.30): --enable-ipv6時にmake checkでnetのテストがコケる
- genstub: #include <gauche/class.h>を入れてほしい
- object-isomorphic?が動かない (0.8.5)
- 正規表現のサブマッチが変(0.8.4)
- defineの挙動が変わった?(0.8.4)
- cygwin でメモリリーク(?) (0.8.4)
- if/and/or でcompile error(0.8.4)
- compile.scmのtypo (0.8.4)
- マニュアル(正規表現) (0.8.4)
- make-timeで異常終了 (〜0.8.4)
- cgi-mainのcgi-output-character-encodingが動かない場合がある (0.8.3, 0.8.4)
- with-signal-handlers内でsys-waitpidを呼ぶと、正しく子プロセスが取得できない事がある (0.8.3, 0.8.4)
regexp-compile (0.8.5)
(2005/11/02 00:05:49 PST): non-greedy matching や assertion を含むパターンを regexp-compile できないみたいです。
gosh> (regexp-compile (regexp-parse "(?=a)"))
*** ERROR: invalid regexp AST: (assert #\a)
Stack Trace:
_______________________________________
0 (regexp-compile (regexp-parse "(?=a)"))
At line 1 of "(stdin)"
1 (regexp-compile (regexp-parse "(?=a)"))
At line 1 of "(stdin)"
--- regexp.c.orig Wed Nov 2 16:54:45 2005
+++ regexp.c Wed Nov 2 16:57:22 2005
@@ -1550,12 +1550,15 @@
}
if (SCM_EQ(type, SCM_SYM_SEQ) || SCM_EQ(type, SCM_SYM_ALT)
|| SCM_EQ(type, SCM_SYM_SEQ_UNCASE) || SCM_EQ(type, SCM_SYM_SEQ_CASE)
- || SCM_EQ(type, SCM_SYM_REP) || SCM_EQ(type, SCM_SYM_REP_WHILE)) {
+ || SCM_EQ(type, SCM_SYM_ASSERT) || SCM_EQ(type, SCM_SYM_NASSERT)
+ || SCM_EQ(type, SCM_SYM_REP) || SCM_EQ(type, SCM_SYM_REP_MIN)
+ || SCM_EQ(type, SCM_SYM_REP_WHILE)) {
rest = rc_setup_context_seq(ctx, SCM_CDR(ast));
if (SCM_EQ(SCM_CDR(ast), rest)) return ast;
else return Scm_Cons(type, rest);
}
- if (SCM_EQ(type, SCM_SYM_REP_BOUND)) {
+ if (SCM_EQ(type, SCM_SYM_REP_BOUND)
+ || SCM_EQ(type, SCM_SYM_REP_BOUND_MIN)) {
if (!SCM_PAIRP(SCM_CDR(ast)) || !SCM_INTP(SCM_CADR(ast))
|| SCM_INT_VALUE(SCM_CADR(ast)) < 0) {
goto badast;
- Shiro(2005/11/02 02:55:10 PST): 直しました。0.8.6にすべりこみセーフ、かな。
dbd.pg:151行目 (0.8.6_pre3 CVS HEAD 2005/11/01 01:49:09 PST)
pg-getvalue は pq-getvalue だと思いますkatsujiro
www.cgiで、with-output-to-string等の中でエラーが発生した時にエラー画面が出力されない(0.8.5)
nekoie (2005/10/30 04:10:27 PST) かなり以前の、with-error-handlerのエラーハンドラ内はエラー時の環境を引き継ぐようになった時からの不具合だと思います。 ついでなので、エラー画面にはスタックダンプも表示するようにしておきました(こっちの方は、セキュリティ的に微妙な問題が発生しないとは限らないですけど)。
- Shiro(2005/10/30 17:04:08 PST): パッチ頂きました。スタックダンプの方は、 デフォルトで安全側に倒すという方針から今回は含めていません。 パラメータか何かで切替えられるようにしても良いとは思います。
正規表現の optimize に失敗する(0.8.5)
(2005/10/28 02:32:34 PDT) #/(?:abc){2,5}/ のような正規表現の optimize に失敗しているみたいです。
gosh> #/(?:abc){2,5}/
"regexp.c", line 1256 (rc3_rec): Assertion failed: Scm_Length(ast) == 3 && SCM_INTP(SCM_CADR(ast))
gosh> (regexp-compile (regexp-parse "(?:abc){2,5}"))
#<regexp 0x9ed70>
gosh> (regexp-optimize (regexp-parse "(?:abc){2,5}"))
(0 #\a #\b #\c #\a #\b #\c (rep-bound 3 #\a #\b #\c))
gosh> (regexp-compile (regexp-optimize (regexp-parse "(?:abc){2,5}")))
"regexp.c", line 1256 (rc3_rec): Assertion failed: Scm_Length(ast) == 3 && SCM_INTP(SCM_CADR(ast))
- Shiro(2005/10/28 05:03:30 PDT): や、これはAssertionの方が変でした。 Scm_Length >= 3 でなければなりません。
regexp-compile で wb, nwb が使えない (0.8.5)
2005/10/28 02:15:14 PDT: regexp-compile に wb, nwb を含む抽象構文木を与えるとエラーになります。
gosh> (regexp-parse "\\b\\w+")
(0 wb (seq #0=#[0-9A-Z_a-z] (rep #0#)))
gosh> (regexp-compile (regexp-parse "\\b\\w+"))
*** ERROR: invalid regexp AST: wb
Stack Trace:
_______________________________________
0 (regexp-compile (regexp-parse "\\b\\w+"))
At line 2 of "(stdin)"
1 (regexp-compile (regexp-parse "\\b\\w+"))
At line 2 of "(stdin)"
gosh> (regexp-compile '(0 nwb))
*** ERROR: invalid regexp AST: nwb
Stack Trace:
_______________________________________
0 (regexp-compile '(0 nwb))
At line 3 of "(stdin)"
1 (regexp-compile '(0 nwb))
At line 3 of "(stdin)"
こんな感じでしょうか。
--- regexp.c.orig Fri Oct 28 18:07:56 2005
+++ regexp.c Fri Oct 28 18:09:41 2005
@@ -1527,6 +1527,7 @@
return ast;
}
if (SCM_EQ(ast, SCM_SYM_BOL) || SCM_EQ(ast, SCM_SYM_EOL)
+ || SCM_EQ(ast, SCM_SYM_WB) || SCM_EQ(ast, SCM_SYM_NWB)
|| SCM_EQ(ast, SCM_SYM_ANY)) {
return ast;
}
- Shiro(2005/10/28 04:54:26 PDT): ほい。直しました。
sys-dirname、sys-basenameに失敗(0.8.5, sjis)
2005/10/24 04:43:52 PDT 小田と言います。
上記を利用しているdecompose-pathもこけます。
正確にいうと、incomplete文字列になる可能性があります。
仕様なのかな? でもWindowsでまじめに使おうと思うといろいろと弊害もあるので、以下のようなパッチを当ててみました。
EUCやutf-8のときに迷惑なのは重々承知しておりますので、条件コンパイルなどにしていただければ、と。
- Shiro(2005/10/25 04:42:15 PDT): ども。これは元コードが手抜きだったので、 ご指摘の線で直すようにします。 たぶんこのへんのルーチンをがりがりチューンしても 全体の性能への寄与はほとんど無いので、素直に頭からマルチバイトを 考慮してスキャンする方がenbugの可能性も少なく良いコードだと思います。
- Shiro: 考えてみたらsys-normalize-pathnameも同じ問題を抱えているし、 それを使ってるfile.utilの*-path系統も影響を受けますな。 Sys_NormalizePathnameも汚いコードだったので、この際直してしまいましょう。
- 小田(2005/10/26 19:56:44 PDT): ありがとうございます。0.8.6をお待ちしております。
string-prefix-lengthの挙動が変?(0.8.5)
(2005/10/24 01:11:25 PDT)srfi-13のstring-prefix-lengthの返す結果が間違える場合があるみたいです。
gosh> (string-prefix-length "abc" "abcd") 3 gosh> (string-prefix-length "abcd" "abc") 4
たぶんlib/srfi-13/prefix.scmの%string-prefix-intのcond節2行目の
((eof-object? ch2) (action (string-pointer-index sp1) #f))
のsp1をsp2にすれば良いと思うのですが。
- Shiro(2005/10/24 02:07:55 PDT): はい。CVS HEADでは直ってます。0.8.6をお待ち下さい。
port->stringで、バイナリ文字列も読み取ってほしい (0.8.5,euc-jp)
nekoie(2005/09/21 16:06:11 PDT) gauche/portutil.scmのport->stringの内部でread-charを使っているので、 マルチバイト文字を構成しないバイナリデータがあると、エラーになってしまう。 とりあえず、read-charをread-byteにして、動くのを確認しました。
--- portutil.scm.orig 2005-09-22 07:52:30.000000000 +0900
+++ portutil.scm 2005-09-22 07:54:30.000000000 +0900
@@ -47,10 +47,10 @@
(let ((out (open-output-string :private? #t)))
(with-port-locking port
(lambda ()
- (let loop ((ch (read-char port)))
+ (let loop ((ch (read-byte port)))
(unless (eof-object? ch)
- (write-char ch out)
- (loop (read-char port))))
+ (write-byte ch out)
+ (loop (read-byte port))))
(get-output-string out)))))
(define (port->list reader port)
動作確認用一発S式(euc-jp用)。
(port->string (open-input-string #*"a\0a\xff\xfe\xfd"))
- び(2005/09/21 17:23:44 PDT): port->stringが不完全文字列を返すのはどうなのかなー、という気がするわたしは、よく次のようなイディオムを使います。それに、write-byteを生真面目に呼ぶのは遅そうだし。
(with-port-locking port (lambda () (call-with-output-string (cute copy-port port <>)))もっともこれにしたところで、完全文字列で表現できるかどうかバッファを一回スキャンするはずなので、遅そうですけど。- nekoie(2005/09/22 02:56:50 PDT): なるほどです。バイナリデータを不完全文字列にして扱おうと言うのが、ちょっと微妙だったんですね……。自分もコレ使うようにします。あと、この話題とは直接は関係無いですけど、何時の間にか、上の「動作確認用一発S式」の文字列の中のバックスラッシュが「?」になってました。WiLiKiのバグ?
- Shiro(2005/09/22 03:46:31 PDT): たぶん、ブラウザとWiLiKi間で EUC-JP→Unicode→EUC-JPのround trip conversionが行われる際に おかしなことになっているんではないかと予想しているんですが、 ちゃんと確かめてはいないです。
- び(2005/09/22 03:57:31 PDT): 現象だけ言えば、Firefox on Mac OS Xでは\が?になる問題は発生していません。SafariはNGです。Firefoxも直ったのは割と最近だと思います。というか以前は確かNGだったのに、最近OKなことに気づいた。なので、WiLiKiに書き込む時だけFirefoxを起動しています。Opera 8.50 on Mac OS XでもOK、シイラはNG。ってことで、WebKitの問題なんじゃないかと言う気が。
sandbox環境からのautoloadが失敗する (0.8.5)
Shiro(2005/09/20 22:02:15 PDT): soutaroさんのところより。 autoloadの定義時の環境と解決時の環境が異なっているせいだろう。 次のパッチでどうか。 kahua-dev:1050も 同根か。
--- src/load.c 25 Aug 2005 03:19:54 -0000 1.101
+++ src/load.c 21 Sep 2005 04:48:44 -0000
@@ -986,6 +986,8 @@
ScmObj Scm_LoadAutoload(ScmAutoload *adata)
{
int error = FALSE;
+ ScmModule *prev_module;
+ ScmVM *vm = Scm_VM();
/* check if some other thread already loaded this before attempt to lock */
if (adata->loaded) {
@@ -997,14 +999,14 @@
do {
if (adata->loaded) break;
if (adata->locker == NULL) {
- adata->locker = Scm_VM(); /* take me */
- } else if (adata->locker == Scm_VM()) {
+ adata->locker = vm;
+ } else if (adata->locker == vm) {
/* bad circular dependency */
error = TRUE;
} else if (adata->locker->state == SCM_VM_TERMINATED) {
/* the loading thread have died prematurely.
let's take over the task. */
- adata->locker = Scm_VM();
+ adata->locker = vm;
} else {
(void)SCM_INTERNAL_COND_WAIT(adata->cv, adata->mutex);
continue;
@@ -1023,8 +1025,11 @@
adata->module, adata->name);
}
+ prev_module = vm->module;
SCM_UNWIND_PROTECT {
+ vm->module = adata->module;
Scm_Require(SCM_OBJ(adata->path));
+ vm->module = prev_module;
if (adata->import_from) {
/* autoloaded file defines import_from module. we need to
@@ -1059,6 +1064,7 @@
}
} SCM_WHEN_ERROR {
adata->locker = NULL;
+ vm->module = prev_module;
SCM_INTERNAL_COND_SIGNAL(adata->cv);
SCM_NEXT_HANDLER;
} SCM_END_PROTECT;
ドキュメントに report-error 手続きのエントリがない
nobsun(2005/09/20 21:00:56 PDT): 隠し手続き? :-)
CVS HEAD: 大きな実数へのinteger?
gosh> (integer? (/ (expt 3 33) 2)) #f gosh> (integer? (/ (expt 3 34) 2)) #t
び(2005/09/20 20:04:53 PDT): バグと言うより実装上の制限なのかな、という気もするんですが...
- Shiro(2005/09/20 20:30:30 PDT): へい。実装上の制限です。 奇数を2で割った時点でinexact numberになってしまうため、それに述語を適用した 結果もinexactになります。内部では一応浮動小数点数の小数部があるかどうかで integerかどうかを判断してるんで、絶対値が2^53を越えるとどんなreal numberに 対してもinteger?は#tを返します。 正しい結果は、exact rationalが実装されるまでおあずけです。
directory-list (build-path) で error(0.8.5)
(2005/09/13 23:43:00 PDT): 先頭が~のファイルがいると、:add-path? #tでdirectory-list を呼んだとき error になる。
gosh> (touch-file "~hoge")
gosh> (directory-list "./" :add-path? #t)
*** ERROR: can't append absolute path after other path "~hoge"
Stack Trace:
_______________________________________
0 (rec (cond ((string-null? base) component) ((string-null? componen ...
At line 201 of "/usr/local/share/gauche/0.8.5/lib/file/util.scm"
1 (rec (cond ((string-null? base) component) ((string-null? componen ...
At line 201 of "/usr/local/share/gauche/0.8.5/lib/file/util.scm"
2 (sys-normalize-pathname p)
At line 200 of "/usr/local/share/gauche/0.8.5/lib/file/util.scm"
- Shiro(2005/09/14 02:43:57 PDT): あっそうか。lib/file/util.scmのrelative-path? を
これに置き換えて下さい。 (CVS HEADでは libsrc/file/util.scm にあります)
(define (relative-path? path) (cond-expand (gauche-windows (not (#/^[?/??]|^[A-Za-z]:/ path))) (else (not (#/^?// path)))))
named letの解析に失敗(0.8.5+FreeBSD-4.11)
(2005/09/11 16:32:17 PDT) はじめまして。 プラットホーム依存かもしれませんが、多分バグだと思うので報告しておきます。 src/wiliki/format.scmのコンパイルに失敗しました。
Testing formatter ... *** ERROR: Comp ile Error: Compile Error: wrong number of arguments: loop requires 3, but got 4 "../src/wiliki/format.scm":328:(define (fmt-lines generator) (defin ... "./format.scm":9:(use wiliki.format) Stack Trace: ______________________________________ *** Error code 70 Stop in /bsd/current/ports/www/wiliki/work/WiLiKi-0.5/test.
今のところ0.8.3で動かしています。0.8.4は未確認。
- Shiro: WiLiKiをアップデートして下さい。 http://lists.sourceforge.jp/mailman/archives/gauche-devel-jp/2005-May/001375.html
- Known problemでしたか。失礼しました。FreeBSD/portsのバージョンが上がれば解決する問題のようですが、現時点では整合性が取れていないようです。WiLiKiがsxmlに依存している件(ports/85996)は報告しておきましたが、こちらもお願いしておいた方が良さそうですね。
- Shiro: ちょっとportsのproblem reportを覗いてみたんですが、 sxmlは既にgauche本体に取り込まれており、obsoletedになって久しいです。 もしgauche-sxmlがまだアクティブなのでしたら、それを削除してもらえるように アレンジして頂けないでしょうか。
- ports/textprocにはアクティブでリストされています。9/22の削除予定リストには含まれていませんでした。OwnerであるShiroさんからMaintainer(erik@smluc.org or ports@freebsd.org)に説明していただけると早いような気がしますが、その旨、伝えておきます。
- gauche-sxmlはFreeBSD-portsより削除されました。WiLiKiも0.5.3にアップデートされます。とこで、gauche-gdbmもobsoleteですか?
- Shiro(2005/09/18 17:19:40 PDT): gauche-gdbmはパッケージのやり方によります。 ソースはGaucheのコアに含まれていますが、バイナリにした場合はライセンスの関係 でコアとは別パッケージで配布した方が良いでしょう (gdbmに直接リンクする部分は GPLの影響を受けると考えられるため。コアの他の部分はBSDL)。
socket-status (0.8.6-pre2)
(2005/09/11 02:45:01 PDT) socket-statusの返すシンボルが、マニュアルでは小文字ですが、実際に返ってくるのは大文字です。
SOCKET の内部状態を、以下のシンボルのどれかで返します。
none 生成直後
bound `socket-bind'
によって、あるアドレスに束縛されている
listening `socket-listen' によって、接続をリッスンしている
connected `socket-connect' あるいは `socket-accept'
によって接続されている
shutdown `socket-shutdown' によってシャットダウンされた
closed `socket-close' によってクローズされた
実際には大文字のNONE, BOUND, LISTENING, CONNECTED, SHUTDOWN, CLOSEDが返ります。どちらかにあわせてもらうと助かります。
- Shiro: ありゃ、どうしてこんなことが…とちょっとしらべてみたらなんとまあ、 これは、Gaucheがcase sensitiveになる前に書かれたコードでした。 (そう、Gaucheは昔、R5RSに忠実に、シンボルの大文字小文字を区別しなかったのです)。 気持ちとしては小文字にしたいですねぇ。大文字をあてにしてかかれちゃってるコードは あるかなあ。
CVS HEAD: exportされていないシンボルがモジュール外から見えている
び(2005/09/10 16:00:02 PDT): いつの頃からかわかりませんが、モジュールからexportされていないシンボルが、モジュール外からも見えてしまっています。
% gosh gosh> (use www.cgi) #<undef> gosh> get-meta #<closure get-meta> gosh>
- Shiro (2005/09/10 16:28:44 PDT): やあ、こりゃ大変だ。直しました (module.c, v 1.59)
SRFI-19 string->date
katsujiro(2005/09/09 06:57:56 PDT) 0.8.6pre2 CVS HEAD
string->dateを使うと unbound variable read-chと出ますので、多分、下のパッチで良いのではないかと。
*** srfi-19-lib.scm Fri Sep 2 10:57:19 2005
--- /usr/local/share/gauche/0.8.6_pre2/lib/srfi-19.scm Fri Sep 9 22:33:42 2005
***************
*** 1013,1020 ****
(+ (* accum 10) (tm:char->int (read-char port)))
(+ nchars 1)))
(padding-ok
! (read-ch port) ; consume padding
! (accum-int prot accum (+ nchars 1)))
(else ; padding where it shouldn't be
(error "string->date: Non-numeric characters in integer read."))
)))
--- 1013,1020 ----
(+ (* accum 10) (tm:char->int (read-char port)))
(+ nchars 1)))
(padding-ok
! (read-char port) ; consume padding
! (accum-int port accum (+ nchars 1)))
(else ; padding where it shouldn't be
(error "string->date: Non-numeric characters in integer read."))
)))
当方ではこれをこのままCに変換せずに使って使えてます。
- Shiro(2005/09/10 02:25:54 PDT): 直しました。
- katsujiro(2005/10/07 07:54:48 PDT): 最新のcvs-headを取ってきたのですが、(accum-int prot ...)の方が直ってないみたいです。
CVS HEAD: <mersenne-twister>の:seed引数
び(2005/09/07 20:21:50 PDT): mt-random-set-seed!にはu32vectorも渡せるのだから、(make <mersenne-twister> :seed ...)にもu32vectorを渡せていいんじゃないでしょうか。
Index: ext/mt-random/mt-random.c
===================================================================
RCS file: /cvsroot/gauche/Gauche/ext/mt-random/mt-random.c,v
retrieving revision 1.15
diff -u -r1.15 mt-random.c
--- ext/mt-random/mt-random.c 22 Jul 2005 09:26:54 -0000 1.15
+++ ext/mt-random/mt-random.c 8 Sep 2005 03:13:09 -0000
@@ -277,8 +277,8 @@
ScmObj seed = Scm_GetKeyword(key_seed, initargs, SCM_FALSE);
ScmMersenneTwister *mt;
- if (!SCM_FALSEP(seed) && !SCM_EXACTP(seed)) {
- Scm_Error("seed needs to be an exact integer, but got: %S", seed);
+ if (!SCM_FALSEP(seed) && !SCM_EXACTP(seed) && !SCM_U32VECTORP(seed)) {
+ Scm_Error("seed needs to be an exact integer or u32vector, but got: %S", seed);
}
mt = SCM_NEW(ScmMersenneTwister);
@@ -286,6 +286,8 @@
mt->mti = N+1;
if (SCM_EXACTP(seed)) {
Scm_MTInitByUI(mt, Scm_GetUInteger(seed));
+ } else if (SCM_U32VECTORP(seed)) {
+ Scm_MTInitByArray(mt, SCM_U32VECTOR_ELEMENTS(seed), SCM_U32VECTOR_SIZE(seed));
}
return SCM_OBJ(mt);
}
- Shiro: ごもっとも。直しました。
ext/net/netlib.stub(1.30): --enable-ipv6時にmake checkでnetのテストがコケる
Testing net ... failed.
discrepancies found. Errors are:
test inet server socket: expects #t => got #<error "const C string or #f required, but got #f">
test inet client socket: expects ("ABC" "XYZ") => got #<error "connect failed to #<sockaddr inet ?"127.0.0.1:6726?">: Connection refused">
test inet client socket: expects #t => got #<error "connect failed to #<sockaddr inet ?"127.0.0.1:6726?">: Connection refused">
test inet client socket: expects #t => got #<error "connect failed to #<sockaddr inet6 ?"[::1]:6726?">: Connection refused">
test inet client socket: expects 33 => got #<error "connect failed to #<sockaddr inet ?"127.0.0.1:6726?">: Connection refused">
failed.
discrepancies found. Errors are:
test inet client socket: expects ("ABC" "XYZ") => got #<error "connect failed to #<sockaddr inet ?"127.0.0.1:6726?">: Connection refused">
test inet client socket: expects #t => got #<error "connect failed to #<sockaddr inet ?"127.0.0.1:6726?">: Connection refused">
test inet client socket: expects #t => got #<error "connect failed to #<sockaddr inet6 ?"[::1]:6726?">: Connection refused">
test inet client socket: expects 33 => got #<error "connect failed to #<sockaddr inet ?"127.0.0.1:6726?">: Connection refused">
1.29ではこの問題は起こりません。何となくgenstubの問題(maybe:<const-cstring>の展開がおかしい)のような気もします。Mac OS X 10.4.2で確認しました。
- Shiro: このへんは今かなりアクティブに更新しているところなので、 もう2〜3日したら落ち着くと思います。
- 了解です。お騒がせしました。
genstub: #include <gauche/class.h>を入れてほしい
define-cclassでslot指定をするときに、gauche/class.hがないとincomplete typeとかでおこられます。ねるWiki:ねる (2005/08/03 00:31:06 PDT)
object-isomorphic?が動かない (0.8.5)
マニュアルでは、object-isomorphic?を特定化することにより、ユーザ定義のクラスに対してisomorph?の動作をカスタマイズできるということになっていますが、これが動作しません。util.isomorphの中で、object-isomorphic?が(ジェネリック関数ではなく)手続きとして定義されているのがとりあえずの原因です。(2005/08/02 05:08:31 PDT)
- Shiro: あらほんとだ。今までobject-isomorphic? をオーバロード したことが無かったんで気づかなかったんですね。直しときます。
正規表現のサブマッチが変(0.8.4)
(define (match str)
(rxmatch-case str
(#/?((.*)?)/ (match) (print match))))
というパターンで、
(match "(xxx)") -> (xxx)
とマッチ。サブマッチで要求してるのは括弧の内側だけだから変ですよね。 Kitani 2005/06/24 13:13:11 PDT
あら、バックスラッシュが出ない。。外側は()のリテラルです。
- Shiro: rxmatch-caseは、最初の変数にマッチ全体を、
以降の変数にサブマッチをbindします。サブマッチが欲しければ
(rxmatch-case str ($/?((.*)?)/ (#f sub) (print sub)))
のようにして下さい。
- もうしわけないです。大いに勘違いしてました。 2005/06/24 22:38:53 PDT
defineの挙動が変わった?(0.8.4)
0.8.3と0.8.4でdefineの挙動が少し変わったようです。具体的には下記のコードを実行したとき、
(define (test1) (define l (list 1 2 3)) (define firstl (car l)) (print firstl)) (test1)
0.8.4では次のようなエラーになりますが、0.8.3では「1」と表示されます。
*** ERROR: pair required, but got #<undef> Stack Trace: _______________________________________ 0 l
ふじさわ 2005/06/23 17:28:19 PDT
- これってR5RSとしてはエラーになるのが正しいんですよね? (ひらい)
- Shiro: そうです。0.8.4で「直った」のだと考えて下さい。
- ytaki(2005/06/24 04:12:21 PDT): 更に確認で申し訳ありませんが,上記が R5RS 的に
エラーなのは,内部での define が局所定義であり,(一つの)letrec による
置き換えと等価と考えるから,ということで良いんですよね?なので,Gauche で
(define (test2) (define firstl (car l)) (define l (list 1 2 3)) (print firstl)) (test2)
や(define (test3) (define l '(1 2 3)) (define firstl (car l)) (print firstl)) (test3)
で 1 が表示されるのもホントはまずい…ということでいいんですよね(^^;). 『Scheme:内部defineの評価順』をざっと読んでの解釈なのですが…. - Shiro: はい、内部defineはletrecであり、letrecの各変数の初期値の 計算にそのスコープの変数の値を必要としてはいけないから、ですね。 まあ、ホントはまずいというか、教育上よろしくないですね。 R5RSは正しいプログラムの動作については明確に定めていますが、 正しくないプログラムがどう振る舞うかについては何も言っていないので、 何をしようが処理系の勝手ではあります。ただ、正しい仕様に関する誤解を 助長してしまうのは初心者向けではないですね。このケースは、正しくない場合の エラー検出をやろうとするとちょっとコストが高いのと、一度理解すれば
うっかりミスで書いてしまうというようなものではないので、 厳密なエラー検出を実装する優先度はかなり低いです。
- ふじさわ(2005/06/24 06:10:06 PDT): なるほど。いろいろ勉強になりました。 ありがとうございます。まだよく理解できていないのですが、R5RSでは トップレベルとローカルでdefineの意味論が異なるのですね(間違ってたらすみません)。 「トップレベルがなんちゃら」という議論を目にしたことがあるので、 「もしかして今回のがそれかな」などと思っていたのですが、 いやー本当に勉強になります。
- ytaki(2005/06/25 11:47:06 PDT): トップレベルと内部の define の違いは R5RSで 割と細かく言及していますので参考になると思います(仕様書なので当然といえば 当然ですが^^;).ちなみに,MIT Scheme では,test1 が通って test2 がエラーになります(^^;).
cygwin でメモリリーク(?) (0.8.4)
i686-pc-cygwin の環境で ssax:xml->sxml を繰り返すとメモリ使用量がどんどん増えていってしまいます。 i686-pc-linux-gnu では発生しません。(2005/06/20 04:43:13 PDT)
(use sxml.ssax)
(let loop ()
(call-with-input-file "適当なXMLファイル.xml"
(cut ssax:xml->sxml <> '()))
(loop))
if/and/or でcompile error(0.8.4)
gosh> (if #f (/ 1 0) #t) *** ERROR: Compile Error: divide by zero "(stdin)":2:(if #f (/ 1 0) #t) Stack Trace: _______________________________________ gosh> (and #f (/ 1 0)) *** ERROR: Compile Error: divide by zero "(stdin)":1:(and #f (/ 1 0)) Stack Trace: _______________________________________ gosh> (or 1 2 3 (/ 1 0)) *** ERROR: Compile Error: divide by zero "(stdin)":1:(or 1 2 3 (/ 1 0)) Stack Trace: _______________________________________
これって先走り過ぎ?cut-sea:2005/06/15 06:11:19 PDT
ちなみにgosh -fno-inlineだとOK.cut-sea:2005/06/15 07:04:43 PDT
基本的には全部そうなんかな。cut-sea
- skimu: 不正な定数項はコンパイル時に検出してくれた方がうれしい気もします。
- あー、定数項だから?評価されてるわけじゃないのか。
gosh> (or 1 2 3 (apply / '(1 0))) 1 gosh> (or 1 2 3 (apply / '(1 0))) 1 gosh> (if #f (apply / '(1 0)) #t) #t gosh> (and #f (apply / '(1 0))) #f gosh> (apply / '(1 0)) *** ERROR: divide by zero Stack Trace: _______________________________________ 0 (apply / '(1 0)) At line 13 of "(stdin)" 1 (apply / '(1 0)) At line 13 of "(stdin)" 2 /確かにコンパイルerrorであって実行時errorではないですね。 失礼。cut-sea:2005/06/15 18:04:43 PDT
うげげげ、
gosh> (- (/ 1 2)) 0.5 gosh> (- 0 (/ 1 2)) -0.5 gosh> (- (- 1)) -1 gosh> (- (- 0 1)) -1 gosh> (- (- (- 1))) -1 gosh> (- (- (- (- 1)))) -1 gosh> (- 0 (- (- 1))) 1
単項マイナスがへんです。0.8.4, CVS 版でMacOS 10.4.1 と NetBSD-1.6.1 の両方で発生。 割り算は OK っぽい。
Shiro (2005/06/15 23:52:46 PDT): うわ痛てぇ。近いうちに修正版を0.8.5として リリースします。パッチはこれで。
diff -u -r1.30 compile.scm
--- compile.scm 8 Jun 2005 17:21:33 -0000 1.30
+++ compile.scm 16 Jun 2005 06:13:49 -0000
@@ -4019,7 +4019,7 @@
((x)
(receive (num tree) (check-numeric-constant x cenv)
(if num
- (or tree ($const (- num)))
+ ($const (- num))
($asm form `(,NEGATE) (list tree)))))
((x y . more)
(receive (xval xtree) (check-numeric-constant x cenv)
compile.scmのtypo (0.8.4)
origformがないっておこられました ねるWiki:ねる
Index: compile.scm
===================================================================
RCS file: /cvsroot/gauche/Gauche/src/compile.scm,v
retrieving revision 1.28
diff -u -r1.28 compile.scm
--- compile.scm 2 Jun 2005 09:43:21 -0000 1.28
+++ compile.scm 6 Jun 2005 07:34:51 -0000
@@ -1633,7 +1633,7 @@
oform flags module cenv))
((_ name expr)
(unless (variable? name)
- (error "syntax-error:" origform))
+ (error "syntax-error:" oform))
(let1 cenv (cenv-add-name cenv (variable-name name))
($define oform flags
(make-identifier (unwrap-syntax name) module '())
@@ -1666,7 +1666,7 @@
($const-undef)))
((_ name expr)
(unless (variable? name)
- (error "syntax-error:" origform))
+ (error "syntax-error:" oform))
;; TODO: macro autoload
(let1 trans (make-macro-transformer name (eval expr module))
(%insert-binding module name trans)
- Shiro(2005/06/06 02:59:26 PDT): Thankee, sai. 異常系のテストがまだまだ不十分ですね。 直しときました。
マニュアル(正規表現) (0.8.4)
Perl式のlookahead assertionについてマニュアルに記述がないようです。(2005/06/01 19:58:57 PDT)
Shiro(2005/06/01 20:09:21 PDT): 間に合いませんでした。
make-timeで異常終了 (〜0.8.4)
(use srfi-19) (make <time> :type 'time-duration :second 0 :nanosecond 1000000000))
上記のコードで、goshが"*** ERROR: Error occurred in error handler"と出力し終了してしまいます。[2005/06/01 08:19:06 PDT]
Shiro(2005/06/01 11:40:36 PDT):
--- src/system.c 24 May 2005 23:28:38 -0000 1.63
+++ src/system.c 1 Jun 2005 18:38:05 -0000
@@ -616,7 +616,7 @@
Scm_Error("real number required, but got %S", val);
}
if ((l = Scm_GetInteger(val)) >= 1000000000) {
- Scm_Error("nanoseconds out of range: %l", l);
+ Scm_Error("nanoseconds out of range: %ld", l);
}
t->nsec = l;
cgi-mainのcgi-output-character-encodingが動かない場合がある (0.8.3, 0.8.4)
ces変換portの仕様変更で、 変換portをcloseするまでは全部書き込まれなくなった為に、 永続的なプロセス内でcgi-mainを使うと、 cgi-output-character-encodingが動かなくなっている気がします。
--- lib/www/cgi.scm.orig 2005-01-26 02:09:37.000000000 +0900
+++ lib/www/cgi.scm 2005-01-26 02:15:13.000000000 +0900
@@ -389,8 +389,10 @@
(html:p (html-escape-string (slot-ref e 'message)))))))
(define (cgi-default-output tree)
- (write-tree tree (wrap-with-output-conversion
- (current-output-port)
- (cgi-output-character-encoding))))
+ (with-output-conversion
+ (current-output-port)
+ (lambda ()
+ (write-tree tree))
+ :encoding (cgi-output-character-encoding)))
(provide "www/cgi")
とすると、動くようになった気がします。
- Shiro(2005/06/01 03:18:43 PDT): しまった。見落としてました。0.8.5に入れます。
with-signal-handlers内でsys-waitpidを呼ぶと、正しく子プロセスが取得できない事がある (0.8.3, 0.8.4)
nekoie: 以下を実行すると、二回目の(uname)のprocess-output->stringの中のsys-waitpidで、正常に子プロセスのpidが取得できずに、以下のエラーになります。(2005/01/07 16:17:34 PST)
*** SYSTEM-ERROR: waitpid() failed: No child processes
一回目の(uname)は正常に動作します。
(use gauche.process)
(define (uname)
(with-signal-handlers
()
(lambda ()
(process-output->string-list "/usr/bin/uname"))))
(uname)
(uname)
以下の二つの環境でエラーになるのを確認しました。
- linux-2.4.18 glibc-2.2.5 gcc-3.4.3
./configure '--enable-multibyte=euc-jp' '--enable-threads=pthreads' '--without-iconv' 'CFLAGS=-Os -march=i686'
- linux-2.6.10 glibc-2.3.3 gcc-3.4.3
./configure '--enable-multibyte=euc-jp' '--enable-threads=pthreads' '--disable-ipv6' '--without-iconv' 'CFLAGS=-O2 -march=pentium4'
以下の環境では二回目以降も問題無く、正常に動作しました。 - FreeBSD 4.10-RELEASE-p5 gcc-2.95.4
Shiro(2005/05/11 02:57:56 PDT): waitpidを呼ぶ前に子プロセスのステータスが 回収されてしまっているようです。SIGCHLDのハンドラがSIG_IGNに設定されていると、 子プロセスのステータスをカーネルが勝手に回収してしまうのでこういう 症状が出ることが考えられます。Gauche本体ではSIGCHLDには触ってない はずなんですが、もしかしてシェルか何かからSIG_IGNが継承されちゃってる なんてことはあるんでしょうか。
Shiro(2005/06/01 03:18:43 PDT): これはむしろ、process-output->string-list等の 関数内でSIGCHLDを設定すべき? でもmultithreadな環境ではそれもやばいな。
Shiro(2005/06/30 12:41:50 PDT): 直ったかな (signal.c,v 1.32)
- (2005/06/30 14:19:51 PDT)NetBSD(--enable-threads=none)とMac OS X(--enable-threads=pthreads)でCVS HEADをビルドしmake checkすると、systemやgauche.process、gauche.netなどのテストがfailします。いずれも「excepts ほにゃらら => got #<error "waitpid() failed: Interrupted system call"」(waitpid()がwait()だったりしますが)という感じでコケてます。
- Shiro(2005/06/30 15:49:14 PDT):へい。1.32のfixは間違いでした。1.33だと如何。
- (2005/06/30 19:03:31 PDT) 今度はNetBSD(--enable-threads=none)、Mac OS X(--enable-threads=pthreads)のいずれもmake check、make install-checkは全てパスしました。