最新のもの: Gauche:Bugs
nobsun 2003/03/27 00:36:35 PST Kernel を rebuild した Linux 2.4.18 (Debian Woody 3.0)上でのことです。
# make test ... testing system ... failed. discrepancies found. Errors are: test access: expects (#t #t #f #t) => got (#t #t #t #t) test access: expects (#t #t #f #f) => got (#t #t #t #t) test access: expects (#t #f #f #f) => got (#t #t #t #f) ...
ねるWiki:ねる 2003/03/13 17:05:53 PST: (errorf "hoge" "hage") とかしたとき gosh が "Error occurred in error handler" でおとされてしまいます。ダブルフォルト扱いなのでしょうが、フォーマット文字列まちがいで殺されてしまうと、ちょっとびっくりします。
Shiro (2003/02/18 01:14:39 PST): SRFI-19のmake-timeの引数の順序を今まで勘違いして ました。スペックでは
make-time type nanosecond second
ですが、Gaucheの実装もドキュメントも間違って
make-time type second nanosecond
となっています。SRFI-19のリファレンス実装が間違っているのを気づかずに 流用して、さらにドキュメントもリファレンス実装から起こしたため 今まで気づきませんでした。
CVSにあるsrfi-19.scm, v 1.11で修正されています。
Shiro (2003/02/14 04:17:46 PST): Gauche:SXMLでRDFに上げた、RSSを取得する ルーチンをマルチスレッドで走らせる、ということをやってたんですが、 GaucheのMT-safeでないコードでつまづきまくりです。とほほ。
Shiro (2002/12/21 16:54:27 PST): mt-random-set-seed!にバグがあり、seedが bignumの時に常に同一のseedが使われるようになってしまっていました。 パッチ:
*** mt-lib.stub 24 Jul 2002 15:38:50 -0000 1.7 --- mt-lib.stub 22 Dec 2002 00:53:14 -0000 *************** *** 16,23 **** (define-type <f64vector> "ScmF64Vector*") (define-cproc mt-random-set-seed! (mt::<mersenne-twister> init) ! "if (SCM_EXACTP(init)) { Scm_MTInitByUI(mt, Scm_GetUInteger(init)); #if !defined(__CYGWIN__) } else if (SCM_U32VECTORP(init)) { Scm_MTInitByArray(mt, SCM_U32VECTOR_ELEMENTS(init), SCM_U32VECTOR_SIZE(init)); --- 16,29 ---- (define-type <f64vector> "ScmF64Vector*") (define-cproc mt-random-set-seed! (mt::<mersenne-twister> init) ! "if (SCM_INTP(init)) { Scm_MTInitByUI(mt, Scm_GetUInteger(init)); + } else if (SCM_BIGNUMP(init)) { + int i; unsigned long s = 0; + for (i=0; i<SCM_BIGNUM_SIZE(init); i++) { + s ^= SCM_BIGNUM(init)->values[i]; + } + Scm_MTInitByUI(mt, s); #if !defined(__CYGWIN__) } else if (SCM_U32VECTORP(init)) { Scm_MTInitByArray(mt, SCM_U32VECTOR_ELEMENTS(init), SCM_U32VECTOR_SIZE(init));
In file included from sha1.c:8: sha.h:59: sys/cdefs.h: ファイルもディレクトリもありません。 make[2]: *** [sha1.o] Error 1 make[2]: Leaving directory `/export/home/sakae/Gauche-0.6.6/ext/digest' # uname -a SunOS eqv 5.8 Generic_108528-10 sun4u sparc SUNW,Ultra-60 # cat /etc/release Solaris 8 1/01 s28s_u3wos_08 SPARC Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. Assembled 28 November 2000 FreeBSDから同名のファイルを持ってきたら無事にコンパイル成功 testもOKになりました。 sakae (2002/12/17 04:12:19 PST)
Shiro (2002/12/17 06:02:56 PST): ccはSunのやつをお使いですか? SourceForgeのSolaris8/sparc/gccでは、 該当ファイルは /opt/sfw/include/ の下にありました。
コンパニオンCDから入れた gcc です。 gcc -v Reading specs from /opt/sfw/lib/gcc-lib/sparc-sun-solaris2.8/2.95.2/specs gcc version 2.95.2 19991024 (release)
ちなみに#include <sys/cdefs.h>を削ったら通ります? 通るようなら configureでヘッダの有無をチェックするように変更します。
In file included from sha1.c:9: sha.h:61: syntax error before `extern' sha1.c:10: syntax error before `typedef' make[2]: *** [sha1.o] Error 1
残念ながら NG でした。/opt/sfw/include/ は、何かの拍子に入る所ですよね。 どんなパッケージに含まれているのでしょう? ちなみに、コンパニオンCDの中身は 全部入れたと記憶してます。(Solarisって面倒なので嫌い ^^;)
Shiro gauche-devel MLで出たのでこちらにも書いておきます。 とりあえずこのパッチを。
*** ext/auxsys/auxsyslib.stub 17 Oct 2002 12:44:28 -0000 1.11 --- ext/auxsys/auxsyslib.stub 24 Jul 2002 15:38:50 -0000 1.10 *************** *** 134,141 **** (define-cproc sys-times () " struct tms info; ScmObj h = SCM_NIL, t; ! clock_t r = times(&info); ! if (r == (clock_t)-1) Scm_SysError(\"times failed\"); SCM_APPEND1(h, t, Scm_MakeInteger(info.tms_utime)); SCM_APPEND1(h, t, Scm_MakeInteger(info.tms_stime)); SCM_APPEND1(h, t, Scm_MakeInteger(info.tms_cutime)); --- 134,141 ---- (define-cproc sys-times () " struct tms info; ScmObj h = SCM_NIL, t; ! int r = Scm_SysCall(times(&info)); ! if (r < 0) Scm_SysError(\"times failed\"); SCM_APPEND1(h, t, Scm_MakeInteger(info.tms_utime)); SCM_APPEND1(h, t, Scm_MakeInteger(info.tms_stime)); SCM_APPEND1(h, t, Scm_MakeInteger(info.tms_cutime));
HP-UX11.00 + HP標準の cc で Gauche-0.6.4 をコンパイルしたら, cc: "uvlib.c", line 9263: error 1539: Cannot do arithmetic with pointers to objects of unknown size. と出てエラーになります。0.6.3では何の問題もなく通っていました。 ./configureのオプション指定は
$ env CC="cc" ./configure --prefix=$HOME --with-local=$HOME --with-slib=$HOME/share/guile/slib
です。 あと,この環境で共有ライブラリを有効にするにはどうしたらよいか,どなたかご存知ありませんか? dynamic-load がことごとくエラーになるので,SLIBもiconvも使えません。 -- そり (2002/10/17 01:34:38 PDT)
=================================================================== RCS file: /cvsroot/gauche/Gauche/ext/uvector/uvlib.stub.sh,v retrieving revision 1.20 diff -r1.20 uvlib.stub.sh 308c308 < SCM_RETURN(Scm_MakeUVector(SCM_CLASS(klass), dstsize, v->elements + start*srcalign)); --- > SCM_RETURN(Scm_MakeUVector(SCM_CLASS(klass), dstsize, (char*)v->elements + start*srcalign)); 325c325 < r = Scm_Getz(v->elements + start*eltsize, (end-start)*eltsize, port); --- > r = Scm_Getz((char*)v->elements + start*eltsize, (end-start)*eltsize, port); 337c337 < Scm_Putz(v->elements + start*eltsize, (end-start)*eltsize, port); --- > Scm_Putz((char*)v->elements + start*eltsize, (end-start)*eltsize, port);
satoru 比較関数つきの sort が遅いことに気づきました。(2002/10/09 03:28:12 PDT)
% gosh -V Gauche scheme interpreter, version 0.6.3 [euc-jp,pthreads] % time gosh -e '(sort (port->string-list (current-input-port)))' < /usr/share/dict/words 0.61s total : 0.60s user 0.01s system 100% cpu % time gosh -e '(sort (port->string-list (current-input-port)) string<?)' < usr/share/dict/words 8.13s total : 7.84s user 0.34s system 100% cpu % time gosh -e '(port->string-list (current-input-port))' < /usr/share/dict/words 0.28s total : 0.28s user 0.00s system 100% cpu
ちなみに、Rubyだとこのくらいでした。
% time ruby -e 'readlines.sort' /usr/share/dict/words 0.25s total : 0.26s user 0.01s system 105% cpu % time ruby -e 'readlines.sort {|a, b| a <=>b}' /usr/share/dict/words 2.23s total : 2.25s user 0.01s system 101% cpu % time ruby -e 'readlines' /usr/share/dict/words 0.10s total : 0.09s user 0.02s system 109% cpu
テキスト処理のプログラムを Gauche でばりばり書いているので、同じくらい速くなるとうれしいです。
satoru cons が遅いことに気づきました。(2002/10/09 02:30:04 PDT])
もともとは srfi-1 の filter が遅いのに気づいたんですが、 もとを正すと、どうも cons が遅いのが原因のようです。
% gosh -V Gauche scheme interpreter, version 0.6.3 [euc-jp,pthreads] % cat foo.scm (use srfi-1) ;; 80文字より短い行だけを抽出する (filter (lambda (x) (< (string-length x) 80)) (port->string-list (current-input-port))) % time gosh foo.scm < /usr/share/dict/words 461.83s total : 460.59s user 0.23s system 99% cpu
Pentium III 1 GHz の計算機を使っています。filter に限らず
(define (enumerate-interval low high) (if (> low high) '() (cons low (enumerate-interval (+ low 1) high)))) (enumerate-interval 1 100000)
のように、再帰して cons しまくって長いリストを作るコードが全般的に遅いようです。 再帰が遅いのではなく、遅いのは cons のようです。 foo.scm の例では 80 の部分を 0 にすると、filter の結果が空リストになるので、 0.3秒程度で返ってきました。
(define (filter predicate items) (let loop ((result '()) (items items)) (cond ((null? items) (reverse! result)) ((predicate (car items)) (loop (cons (car items) result) (cdr items))) (else (loop result (cdr items))))))
satoru Red Hat Linux 7.2 + Gauche 0.6.3 で次のコードを実行すると固まることに気づきました。(2002/09/25 20:06:43 PDT)
% gosh -u gauche.charconv gosh> (ces-convert "あいう" "eucjp" "iso2022jp") "\x1b$B$\"$$$&\x1b(B" gosh> (ces-convert "あいう" "eucjp" "iso-2022-jp") ;; 返って来ない
上のほうは jconv.c のコードが使われていて、下は iconv(3) が動いているのかなあ。 jconv.c の conv_supports には
{ "iso-2022-jp", JCODE_ISO2022JP },
を加えた方がいいかも。
このへんのcharsetの正式な表記ってどこかにまとまっていませんかね。 ご存知の方いらっしゃいましたら教えて下さい。
satoru port->string が遅いことに気づきました。(2002/09/19 10:27:16 PDT)
(use srfi-19) (use srfi-13) (define (benchmark message thunk) (let ((start-time (current-time))) (thunk) (let ((elapsed-time (time-difference (current-time) start-time))) (format #t "~a: ~a.~a\n" message (time-second elapsed-time) (time-nanosecond elapsed-time))))) (benchmark "port->string" (lambda () (call-with-input-file "/usr/share/dict/words" (lambda (port) (port->string port))))) (benchmark "port->string-list" (lambda () (call-with-input-file "/usr/share/dict/words" (lambda (port) (port->string-list port))))) % gosh -V Gauche scheme interpreter, version 0.6.2 [euc-jp,pthreads] % gosh test.scm port->string: 0.627169000 port->string-list: 0.221794000
Gauche のソースコードをみると
for (;;) { SCM_GETC(ch, port); if (ch == EOF) break; SCM_PUTC(ch, out); }
というループなのでいかにも遅そうであります。
satoru gauche 0.6.2 で次のコードを実行すると固まることに気づきました。
(let ((port (open-output-file "foo.txt"))) (display "foo\n" port) (close-output-port port) (close-output-port port))
Red Hat Linux 7.3 + Gauche 0.6.2 です。(2002/09/18 11:15:58 PDT)
Gauche 0.6 を M-x run-scheme で emacs から使っていて、emacsを強制終了させると、 gosh.coreができますが、これは仕様でしょうか? 環境は、emacs 20.7 + FreeBSD 4.6-stable です。--sakae (2002/07/31 07:26:45 PDT)
gosh> (use slib) (#<module slib> #<module gauche.interactive>) gosh> (require 'transcript) : gosh> (transcript-on "./test.log") #<oport ./test.log 0x810d460> gosh> (gauche-architecture-directory) "/usr/local/lib/gauche/0.6.1/i386-unknown-freebsd4.6" gosh> (slib:report) SLIB "2d4" on gauche "0.6.1" on UNIX (IMPLEMENTATION-VICINITY) is "/usr/local/share/gauche/0.6.1/lib/" (LIBRARY-VICINITY) is "/usr/local/share/slib/" (SCHEME-FILE-SUFFIX) is ".scm" Loaded *MODULES* are: ("/usr/local/lib/scm/slib/trnscrpt") loaded *FEATURES* : transcript Implementation *FEATURES* : srfi-28 srfi-27 srfi-25 srfi-23 srfi-22 srfi-19 srfi-18 srfi-17 srfi-14 srfi-13 srfi-11 srfi-9 srfi-8 srfi-6 srfi-4 srfi-2 srfi-1 srfi-0 bignum complex real rational inexact vicinity source rev5-report eval values dynamic-wind macro delay multiarg-apply char-ready? rev4-optional-procedures rev4-report ieee-p1178 multiarg/and- with-file ieee-floating-point full-continuation srfi defmacro record string-port sort object->string format system getenv program-arguments current-time Implementation *CATALOG* : (schelog . "/usr/local/lib/scm/slib/schelog/schelog") |...|
#<undef> gosh> (transcript-off) #f gosh> (exit) cons:sakae$ ls -l test.log -rw-r--r-- 1 sakae kuma 0 8 13 20:22 test.log
transcriptでは、read/write等を書き換えているようですが、そのせいでしょうか? --sakae (2002/08/13 04:41:58 PDT)
Shiro (2002/08/16 18:04:31 PDT): gauche-dev MLの方で報告があったのでこちらにも メモっときます。 例えば対話環境で、
(set-signal-handler! SIGINT (cut display <>))
のようにしてハンドラをセットした後、"gosh>" のプロンプトが出ている時に SIGINTを送るとインタプリタが終了してしまいます。
MLの方にパッチを送っておきました。 しばらくすればMLのアーカイブで参照できると思います。