Gauche:Bugs:log11
- SLIBのrequireメカニズム変更(3a5以降)への追随 (0.8.12)
- マニュアルの typo (0.8.12)
- copy-fileのキーワード引数の扱い(0.8.12)
- define-syntaxの中でwith-moduleを使うとうまく参照できないことがある (0.8.12)
- http-get などで Host ヘッダにポート番号が渡らない (0.8.12)
- case-folding な正規表現の書き出し (0.8.12)
- cygwinでdefine-cclassを使うとコンパイルエラー (0.8.12)
- 空の環境飛ばしちゃう問題 (CVS HEAD)
- gauche.parseopt の `f' の扱い(0.8.11)
- run-processでの"-i"の展開(0.8.11)
- ソケットポートのバッファリングモード
- make check で gettext が fail (cygwin w/sjis encoding)
- some typo
- 負の有理数の比較
SLIBのrequireメカニズム変更(3a5以降)への追随 (0.8.12)
flatline 2008/02/10 11:46:53 PST : 最新版のSLIBが動かない.CVS headから対処済みのslib.scm.inを取ってきてコンパイルすればよい.
もしくはインストール済みのslib.scmにおいて, require:{require,provide,provided?} という関数3つに対しプレフィクスを require: から slib: に置換.
- Shiro(2008/02/14 04:09:00 PST): 0.8.13で対応。
マニュアルの typo (0.8.12)
tabe(2008/02/07 18:52:46 PST): 名前の typo です。
Index: doc/modutil.texi =================================================================== RCS file: /cvsroot/gauche/Gauche/doc/modutil.texi,v retrieving revision 1.136 diff -u -r1.136 modutil.texi --- doc/modutil.texi 19 Dec 2007 07:43:36 -0000 1.136 +++ doc/modutil.texi 8 Feb 2008 02:48:21 -0000 @@ -12934,15 +12934,15 @@ @c EN This module implements the algorithm to find the longest common subsequence of two given sequences. The implemented algorithm is based on -Eugene Meyers' O(ND) algorithm (@ref{meyers86,[Meyers86],Meyers86}). +Eugene Myers' O(ND) algorithm (@ref{myers86,[Myers86],Myers86}). One of the applications of this algorithm is to calculate the difference of two text streams; see @ref{Calculate difference of text streams}. @c JP このモジュールは、与えられた2つのシーケンスの最長共通サブシーケンスを見つける -アルゴリズムを実装しています。アルゴリズムは、Eugene Meyersの -O(ND)アルゴリズムに基づいています(@ref{meyers86,[Meyers86],Meyers86})。 +アルゴリズムを実装しています。アルゴリズムは、Eugene Myersの +O(ND)アルゴリズムに基づいています(@ref{myers86,[Myers86],Myers86})。 このアルゴリズムを使うアプリケーションの1つは、2つのテキストストリームの 相違点を計算する@ref{Calculate difference of text streams}です。 Index: doc/references.texi =================================================================== RCS file: /cvsroot/gauche/Gauche/doc/references.texi,v retrieving revision 1.4 diff -u -r1.4 references.texi --- doc/references.texi 8 Dec 2007 03:24:30 -0000 1.4 +++ doc/references.texi 8 Feb 2008 02:48:21 -0000 @@ -17,8 +17,8 @@ Representing control in the presence of one-shot continuations, in @i{Proceedings of SIGPLAN '96}, pp. 99--107, 1996. -@anchor{meyers86} -@item [Meyers86] +@anchor{myers86} +@item [Myers86] Eugene Myers, An O(ND) Difference Algorithm and Its Variations, @i{Algorithmica} Vol. 1 No. 2, pp. 251-266, 1986.
- Shiro(2008/02/07 19:22:00 PST): Thanks! リファレンスの中身の方は正しく書いてるのに (論文の現物を見ながら写したか、Siteseerあたりからコピペしたんだと思いますが)、 本文の方は"Meyers"だと思い込んでて気づかなかった模様。思い込みってこわいですな。
copy-fileのキーワード引数の扱い(0.8.12)
yuyam(2008/02/01 06:46:34 PST): 勘違いしていたらすみません。 リファレンスを読むと、keep-modeが偽の場合(デフォルト)は、コピー先が既に存在して safe引数が偽の場合にコピー先のもとのパーミッションが保持されるとあるのですが、この場合でもdefaultpermを設定しようとしているように思います。
http://practical-scheme.net/gauche/man/gauche-refj_128.html#IDX2624
- Shiro(2008/02/02 01:55:39 PST): 修正しました。
- yuyam(2008/02/02 05:10:27 PST): ありがとうございます。本来ならパッチの1つも提示すべきだとおもったのですが、私が仕様を勘違いしているかもと思ったのでご報告だけでおわっちゃいました。
define-syntaxの中でwith-moduleを使うとうまく参照できないことがある (0.8.12)
koguro(2008/01/15 07:14:47 PST): 以下の例のようにdefine-syntaxの中でwith-moduleを使った場合、barではモジュールfooのシンボルaを参照できますが、bazでは参照できません(どうもuserモジュールのシンボルaを参照しようとしているみたいです)。
gosh> (define-module foo) #<undef> gosh> (select-module foo) #<undef> gosh> (define a 1) a gosh> (select-module user) #<undef> gosh> (define-syntax bar (syntax-rules () ((_ v) (with-module foo v)))) #<undef> gosh> (bar a) 1 gosh> (define-syntax baz (syntax-rules () ((_) (with-module foo a)))) #<undef> gosh> (baz) *** ERROR: unbound variable: a Stack Trace: _______________________________________ gosh>
Shiro(2008/02/02 02:11:24 PST): ですね。hygieneとwith-moduleのインタラクションを ちゃんと考えてないっぽいです。
- 今はマクロ定義に現れるidentifierをマクロ定義のコンパイル時のモジュール(user)で マークしちゃう
- with-moduleによってコンパイル時のモジュールが切り替わるのはマクロ展開の後
- 既にモジュールでマークされてるidentifierにはwith-moduleの効果が及ばない (そのidentifierが別のマクロ展開によって挿入されたものかもしれないので)。
- (bar a)の場合は、マーク無しの識別子aが外から供給されているので、展開後にも aにマークがつかず、with-moduleの効果が及ぶことになる。
- だから、別のマクロのテンプレート部に(bar a)が現れた場合、やっぱりaに マークがつくのでうまくいかないはず。
これは結構厄介だなあ。もっと考えないとまずそうです。 保留ということで (以後はsourceforgeのtrackerで)
http-get などで Host ヘッダにポート番号が渡らない (0.8.12)
tabe(2007/12/06 10:10:18 PST): 最初の引数に80以外のポート番号を指定
gosh> (http-get "localhost:8000" "/")
しても、リクエストが
GET / HTTP/1.1 Host: localhost
になります。
- Shiro(2007/12/06 13:35:46 PST): ありゃ。勘違いしてわざわざポート番号を 落としてました。RFC2616の14.23節によればポート番号はつけとかないと ならないんですね。修正しました。
- tabe(2007/12/06 21:41:24 PST): ありがとうございます。HEAD で確認しました。
case-folding な正規表現の書き出し (0.8.12)
tabe(2007/11/19 19:07:43 PST): write すると i が落ちます。
gosh> #/abc/i #/abc/
パッチ:
--- src/regexp.c.orig 2007-08-26 17:16:04.000000000 +0900 +++ src/regexp.c 2007-11-20 11:41:58.000000000 +0900 @@ -238,7 +238,7 @@ static ScmRegexp *make_regexp(void) static void regexp_print(ScmObj rx, ScmPort *out, ScmWriteContext *ctx) { if (SCM_REGEXP(rx)->pattern) { - Scm_Printf(out, "#/%A/", SCM_REGEXP(rx)->pattern); + Scm_Printf(out, (SCM_REGEXP(rx)->flags&SCM_REGEXP_CASE_FOLD) ? "#/%A/i" : "#/%A/", SCM_REGEXP(rx)->pattern); } else { /* fail safe */ Scm_Printf(out, "#<regexp %p>", rx);
- Shiro(2007/11/20 04:54:02 PST): ども。別の方法で直しました。 WishListの方でかなり昔に上がってた、#/a\/b/ の印字表現が #/a/b/ に なってしまうのもついでに直してあります。まだ完全なread/write invarianceは 実現できてないのですが、通常のケースではまあ使えるだろうと思います。
- tabe(2007/11/20 17:21:36 PST): ありがとうございます。0.8.12 で HEAD をビルドし確認しました。 同一性が崩れるケースについても考えてみます。
cygwinでdefine-cclassを使うとコンパイルエラー (0.8.12)
koguro(2007/11/11 04:02:45 PST): cygwin環境で以下のようなstubを作ってコンパイルしようとすると "initializer element is not constant" のエラーが発生します。どうもSCM_CLASS_DEFAULT_CPLが定数でないため発生しているようです(Gauche:Windows/VC++の「DLLとタイプタグ」に書いてあるようなことが原因かと思います)。なお、cpaの内容を明示的に指定("Scm_TopClass"など)すればエラーは回避できました。
(define-cclass <foo> :built-in "ScmFooType*" "Scm_FooTypeClass" () ())
- Shiro(2008/02/08 03:17:38 PST): src/gauche.hのScm_DefaultCPLとScm_ObjectCPLの 前のSCM_EXTERNをexternに変更して再ビルド・インストールしてみてください。 手元ではそれでOKです。SCM_CLASS_* などと同じ扱いにしないとならないわけですね。 しかしWin/VC対応はもっとずっと面倒そうだなあ。cpaの静的初期化を諦めないと だめかも。
空の環境飛ばしちゃう問題 (CVS HEAD)
び(2007/11/08 19:43:17 PST): 手許に残っていた唯一のunofficial patch を見て、何じゃこりゃ、と思ったので蒸し返しておきます。
でも多分まだ対応はされてないですよね。
- Shiro(2007/11/08 22:19:04 PST): あーこれは未対応です。 compile.scmは他にも直さないとならないところがあるんで ちょっと気合いをためてから一気にかかろうかと。
gauche.parseopt の `f' の扱い(0.8.11)
leque(2007/09/30 06:14:11 PDT): gauche.parseopt のドキュメントには、 parse-options や let-args の option-spec では、`f' は引き数の型が「実数 (flonum)」であることを表すとありますが、有理数 (ratnum)を渡してもエラーになりません(有理数∈実数なので問題というほどではないのですが)。
http://practical-scheme.net/gauche/man/gauche-refj_87.html#SEC248
(use gauche.parseopt) (let-args '("-scale" "2/3") ((scale "scale=f")) (print scale)) ; =| 2/3
--- parseopt.scm.orig 2007-08-24 02:22:50.468750000 +0900 +++ parseopt.scm 2007-09-30 21:49:53.046875000 +0900 @@ -100,7 +100,8 @@ (ref optspec 'name) arg))) (define (get-real arg) (or (and-let* ((num (string->number arg)) - ((real? num))) + ((real? num)) + ((= (denominator num) 1))) num) (errorf "a real number is required for option ~a, but got ~a" (ref optspec 'name) arg)))
- Shiro(2007/09/30 14:31:22 PDT): ああそうか。ここはratnumが入る前に書かれたコードですね。
これはむしろ、(exact->inexact num) で全部flonumにcoerceしちゃうってのは
どうでしょう。-scale 0.3333333333333333 のかわりに -scale 1/3 と指定できたら
それはそれで嬉しいように思います。
- leque(2007/10/07 21:55:04 PDT): そうですね。最近同じような処理を書いたときに自分も悩んだのですが、そちらの方が嬉しい気がします。
--- parseopt.scm.orig 2007-03-02 16:39:08.000000000 +0900 +++ parseopt.scm 2007-10-08 13:54:59.000000000 +0900 @@ -101,7 +101,7 @@ (define (get-real arg) (or (and-let* ((num (string->number arg)) ((real? num))) - num) + (exact->inexact num)) (errorf "a real number is required for option ~a, but got ~a" (ref optspec 'name) arg))) (define (get-integer arg)
- leque(2007/10/07 21:55:04 PDT): そうですね。最近同じような処理を書いたときに自分も悩んだのですが、そちらの方が嬉しい気がします。
run-processでの"-i"の展開(0.8.11)
初学者(2007/09/11 08:31:06 PDT):最近scheme始めたばかりなので、勘違いをしてたら申し訳ありません。
gosh> (use gauche.process) #<undef> gosh> (run-process '(ls -i) :wait #t) ls: cannot access 0.0-1.0i: そのようなファイルやディレクトリはありません #<process 7071 "ls" inactive> gosh> (run-process "ls" "-i" :wait #t) 12095895 hoge #<process 7072 "ls" inactive>
実行するコマンドに"-i"を指定すると"0.0-1.0i"に展開されてしまいます。(以前の記法だとうまくいきます。)
ls 以外のコマンドでも同様でした。
- yokota(2007/09/11 12:48:21 PDT): 強制的にシンボルとみなす||を使って以下のようにして下さい。
gosh> (run-process '(ls |-i|) :wait #t)
GaucheマニュアルのGaucheRefj:字句構造のシンボル名の項目 も参照して下さい。任意の文字列をシンボルに変換する手続きGaucheRefj:string->symbolも使えます。
また、GaucheRefj:run-processのマニュアルを見ると以下でも良い事がわかります。gosh> (run-process '("ls" "-i") :wait #t) gosh> (run-process '(ls "-i") :wait #t)
3種類の記述の差はコマンド文字列が長大にならない限りほとんどありませんので好みの方法を使って下さい。Gaucheでは記述時や実行時の効率面からシンボルを使う方が好まれるようです。
- Shiro(2007/09/11 13:13:17 PDT): これは初心者には引っかかりやすい問題ですね。マニュアルに書いておこうかな。原因はyokotaさんが触れているとおり、ダブルクオートしない -i は 数値 として読まれることです。
- 初学者(2007/09/11 18:43:18 PDT): なるほど。。お恥ずかしい限りです。そもそも数値の扱いをちゃんと勉強していませんでした。。yokotaさん、Shiroさん、ありがとうございました。
- yokota(2007/09/13 01:06:35 PDT): (補足) "i" は虚数を示すために使われます。そのためそれ以外の文字と異なる挙動を示す事があります。そのため、 i はシンボル、 -i は数値 0-1i、 +i は数値 0+1i となります。これに対し他の文字、例えば "a" の場合は a, -a, +a の全てがシンボルになります。ただし、 -ia 等と後ろに余計な文字がついて数字と見なせなくなると先頭が -i でもシンボルになります。GaucheRefj:字句構造の数値リテラルとシンボル名の項を参照して下さい。
ソケットポートのバッファリングモード
Shiro(2007/08/26 12:59:54 PDT): socket portのバッファリングモードが強制的に:fullに なってしまうバグがありました。ネットワークアプリケーションの多くは:lineか :noneでないと正常に動作しないと思います。 (悪いことに、:buffering引数を指定しても上書きできません)。 以下のパッチを適用してください。
--- ext/net/netlib.stub 10 Aug 2007 01:19:36 -0000 1.49 +++ ext/net/netlib.stub 26 Aug 2007 19:25:39 -0000 @@ -176,7 +176,7 @@ &keyword (buffering #f) (buffered? #f)) (body <top> (let* ((bufmode :: int)) - (cond ((SCM_FALSEP buffered?) ;for backward compatibility + (cond ((not (SCM_FALSEP buffered?)) ;for backward compatibility (set! bufmode SCM_PORT_BUFFER_FULL)) (else (set! bufmode (Scm_BufferingMode buffering @@ -188,7 +188,7 @@ &keyword (buffering #f) (buffered? #f)) (body <top> (let* ((bufmode :: int)) - (cond ((SCM_FALSEP buffered?) ;for backward compatibility + (cond ((not (SCM_FALSEP buffered?)) ;for backward compatibility (set! bufmode SCM_PORT_BUFFER_FULL)) (else (set! bufmode (Scm_BufferingMode buffering
make check で gettext が fail (cygwin w/sjis encoding)
isi(2007/08/26 07:00:05 PDT): 以前からだと思いますが、make checkでgettextがfailします。
内部文字エンコーディングをsjisでビルドしたcygwin上のGaucheです。
failed. discrepancies found. Errors are: test get-en: "Menu|File|Quit": expects "Quit" => got "Menu|File|Quit" test gettext-en: "Menu|File|Quit": expects "Quit" => got "Menu|File|Quit" test dcgettext-en: "Menu|File|Quit": expects "Quit" => got "Menu|File|Quit" test get-en: "Menu|File|Quit": expects "Quit" => got "Menu|File|Quit" test gettext-en: "Menu|File|Quit": expects "Quit" => got "Menu|File|Quit" test dcgettext-en: "Menu|File|Quit": expects "Quit" => got "Menu|File|Quit"
このとき test.po と motest.mo に関するワーニングが複数行出力されます。
WARNING: error reading from file "../test/data/locale/en/LC_MESSAGES/test.po": #<error "invalid character sequence in ..."> WARNING: error reading from file "../test/data/locale/en/LC_MESSAGES/motest.mo": #<error "invalid character sequence in ...">
原因はcygwinのiconvにあり(下記参照)、また多分にこのようなマイナーな状況下でしか発生しないと思われ、自分も特に困っている訳ではなく、どうしようかとも思ったのですが、make check での fail だし newcommer には優しいだろうとのことで、報告することにしました。
$ iconv --version iconv (GNU libiconv 1.11) Copyright (C) 2000-2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Bruno Haible. $ echo "\\"| iconv -f ascii -t sjis iconv: (stdin):1:0: cannot convert $ echo "\\"| iconv -f ascii -t cp932 \ $ gosh gosh> (use gauche.charconv) #<undef> gosh> (ces-convert "\\" "ascii" "sjis") *** ERROR: invalid character sequence in the input stream: #*"\\" ... Stack Trace: _______________________________________ 0 (read-byte src) At line 131 of "/usr/local/share/gauche/0.8.10/lib/gauche/portutil.scm" gosh> (ces-convert "\\" "ascii" "cp932") "\\" gosh>
cp932だとOK。手元のDebianではsjisもOKだった。
$ iconv --version iconv (GNU libc) 2.3.2 Copyright (C) 2003 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. これはフリーソフトウェアです。利用許諾についてはソースをご覧ください。 商業性や特定の目的への適合性の如何に関わらず、無保証です。 Ulrich Drepperによる書き込み. $ echo "\\"| iconv -f ascii -t sjis \ $
cygwinのiconvがDebianのiconvと同じような仕様になればよいのだけれど...
gauche.charconvでiconvを呼ぶときにsjisだったらcp932に変えてしまう手はどうかな...
- Shiro(2007/08/26 13:06:14 PDT): sjisの解釈が変換系によってまちまちであることを 回避するため、sjis, eucjp, utf8間の相互変換はGaucheが自前でルーチンを 持っています。今回のこれは"ascii" との変換だったのでiconvの方が使われて しまったのかな? Gaucheの変換ルーチンを使うようにすれば問題は起きないはずです。
- isi(2007/08/27 07:27:12 PDT): 説明をシンプルにしようと思って"ascii"としたのですが、実際には次のようになってます。釈迦に説法なとこもあるかも。ご容赦を。
gettextがpoファイルの内容をサーチする際に、poファイルのエンコーディングを指定した"拡張されたポート手続き"を使ってます。具体的には、 Gauche の make check で走るテスト・コードでは ja と en の locale が用意されていて、それぞれ eucjp と ISO-8859-15 のエンコーディングとなっています。なので、gettext で en のテキストをサーチする場合は、ISO-8859-15 から内部コード sjis への変換が起こりますが、これは Gauche自前のルーチンにはないので iconv が呼ばれます。悲しいかな今の cygwin の iconv は ucs4 から sjis への変換時、0x005c と 0x007e を、0x5c、0x7e へはマップしてくれません。 このため、poファイルではマルチ・ラインのメッセージで使う改行文字列 "\n" のところでエラーとなります。 ja の場合は eucjp -> sjis なので自前のルーチンだから問題は起こりません。
自分で制御できないとこで行われるコード変換なので、iconv をどうにかするか、iconv も cp932 だと 0x5c はスルーなので、上記のように書いた次第です。 このテスト・コード以外でこのような使われ方があるのかなあ、と考えていたのですが、どうなんでしょうね。
Shiro(2007/08/29 19:32:47 PDT): なるほど。Gaucheにとって未知のエンコーディングXとsjis間の 変換だとGauche自前のsjisテーブルは使われないわけですね。それだと「変換テーブル の非互換性を避けたい」という最初の目的が果たされないわけだ。
gauche.charconvのレイヤでエンコーディング名のエイリアスを設定できるように するのは可能なので、「Gauche界でのsjisはcp932のaliasです」と してしまう手も無くは無いですね。
変換テーブルのコンパチビリティを重視するなら、sjis <-> X の変換が要求された 場合はunicodeをピボットとした2段変換 sjis <-> utf-8 <-> X として、 utf-8 <-> X にiconvを、sjis <-> utf-8 に内部テーブルを使う、という手も あります。2度手間のようですが、iconv実装もUnicodeをピボットにして変換している はずなので、変換テーブルのルックアップ回数だけ見ればそれほど無駄なことを しているわけではないんじゃないかと (2種のAPIが呼ばれるオーバヘッドは確かに ありますが)。
Shiro(2007/10/29 01:41:36 PDT): 0.8.12には間に合わないので持ち越します (以降はSourceforgeのbug tracker参照)。
some typo
enami (2007/08/16 22:17:24 PDT): typo です。0.8.11には間に合わないかな?
Index: ext/net/net.scm =================================================================== RCS file: /cvsroot/gauche/Gauche/ext/net/net.scm,v retrieving revision 1.40 diff -u -0 -r1.40 net.scm --- ext/net/net.scm 16 Mar 2007 02:21:37 -0000 1.40 +++ ext/net/net.scm 17 Aug 2007 03:56:48 -0000 @@ -78 +78 @@ -;; if ipv6 is supported, these symbols are defiend in the C routine. +;; if ipv6 is supported, these symbols are defined in the C routine. Index: ext/net/gauche/net.h =================================================================== RCS file: /cvsroot/gauche/Gauche/ext/net/gauche/net.h,v retrieving revision 1.8 diff -u -0 -r1.8 net.h --- ext/net/gauche/net.h 22 Mar 2007 11:20:22 -0000 1.8 +++ ext/net/gauche/net.h 17 Aug 2007 03:56:48 -0000 @@ -80 +80 @@ -/* Alternative implemenation in case the system doesn't provide +/* Alternative implementation in case the system doesn't provide Index: lib/gauche/cgen/cise.scm =================================================================== RCS file: /cvsroot/gauche/Gauche/lib/gauche/cgen/cise.scm,v retrieving revision 1.4 diff -u -0 -r1.4 cise.scm --- lib/gauche/cgen/cise.scm 16 Aug 2007 11:29:50 -0000 1.4 +++ lib/gauche/cgen/cise.scm 17 Aug 2007 03:56:48 -0000 @@ -457 +457 @@ -(define-binary logaor= "&=") +(define-binary logand= "&=")
- Shiro(2007/08/29 19:32:47 PDT): 対応しました。
負の有理数の比較
Pla?(2007/08/26 08:08:38 PDT): 分母が異なっていて、両方分数で、両方とも負のときに逆転することがあります
>gosh -V Gauche scheme interpreter, version 0.8.11 [euc-jp,pthreads] >gosh gosh> (> -1/3 -1/2) #f
- Shiro(2007/08/26 17:10:30 PDT): 最適化のためのショートカットパスにバグがありました。 テストするなら全パスをカバーしないとダメ、という教訓再び。
- Pla?(2007/09/16 10:45:39 PDT): せっかくですので、こういうのはどうでしょう(未テストです、すみません)
--- number.1.154.c 2007-09-17 02:16:40.797488000 +0900 +++ number.c 2007-09-17 02:18:58.485473600 +0900 @@ -2343,10 +2343,10 @@ if (s0 > s1) return 1; d = Scm_NumCmp(d0, d1); if (d == 0) return Scm_NumCmp(n0, n1); - if (s0 > 0 && s1 > 0) { + if (s0 > 0 && s1 > 0 || s0 < 0 && s1 < 0) { n = Scm_NumCmp(n0, n1); - if (d > 0 && n <= 0) return -1; - if (d < 0 && n >= 0) return 1; + if (d > 0 && n <= 0) return -s0; + if (d < 0 && n >= 0) return s0; } return Scm_NumCmp(Scm_Mul(n0, d1),
- Shiro(2007/09/16 11:32:19 PDT): "make -s check" でユニットテストが走るようになってます。 ソースを変えた時は走らせてみるといいですよ。上の変更だけでは足りません (もう一箇所変える必要があります)。アイディアはいただきます。
- Pla?(2007/09/16 12:03:36 PDT): 走らせるどころかビルドすらしていませんでした……0.8.11からnumber.cだけ最新のものと差し替えてビルドを試みたのですが、失敗してしまい横着してしまいました。ごめんなさい。cvsでチェックアウトするところからやってみようと思います。 もう一箇所というのはnですよね。絶対値比較をしたいんだから、負のときは逆転させないと……
- Pla?(2007/09/16 15:10:32 PDT): cvsでチェックアウトしたものに対して make -s check で、Testing numbers... が passed. になるようにしました(Cygwinなので、他ではいろいろErrorになりました)。アイディアは、と言っていただいたのにしつこくてすみませんm(_ _)m
--- src/number.c 29 Aug 2007 11:15:24 -0000 1.154 +++ src/number.c 16 Sep 2007 22:03:20 -0000 @@ -2343,10 +2343,10 @@ if (s0 > s1) return 1; d = Scm_NumCmp(d0, d1); if (d == 0) return Scm_NumCmp(n0, n1); - if (s0 > 0 && s1 > 0) { - n = Scm_NumCmp(n0, n1); - if (d > 0 && n <= 0) return -1; - if (d < 0 && n >= 0) return 1; + if (s0 > 0 && s1 > 0 || s0 < 0 && s1 < 0) { + n = Scm_NumCmp(n0, n1) * s0; + if (d > 0 && n <= 0) return -s0; + if (d < 0 && n >= 0) return s0; } return Scm_NumCmp(Scm_Mul(n0, d1),