YamaKen
yamak****@bp*****
2005年 8月 24日 (水) 13:26:36 JST
At Wed, 24 Aug 2005 13:10:41 +0900, mover****@hct***** wrote: > r1274の変更でテストしてみたら動くようになりました。 > ただ、そこに渡ってきているデータ'(())をtrunkの方で試しても無限ループに陥りません > でした。気持ち悪いです... '(())というのはlistsの内容ですよね? それが渡ってくる状況というの は以下のようなフォームが評価された場合なので何もおかしくないです。 (filter positive? ()) 行き違いがあるような気がするんで補足説明しますが、 1) 元々の以下のコードではsingle_listpの評価ロジックに間違いがあ り、常に低速実行パスのみが有効になっていました。ただし遅いだ けで実行はどんな場合でも正常でした。 single_listp = (uim_scm_length(lists) == 1) ? UIM_TRUE : UIM_FALSE; 2) 以下の太田さんの修正によって、リストが1つだけの場合は高速実行 パスが実行されるようになりましたが、その高速実行パス内にバグ があり正常に動作しませんでした。 single_listp = (uim_scm_c_int(uim_scm_length(lists) == 1)) ? UIM_TRUE : UIM_FALSE; 3) r1274でsingle_listpの評価ロジックと高速実行パス内のコードの両 方を修正したので、リストが1つだけの場合高速に実行されるように なりました。1)との違いは実行速度だけです。 > > > 予想以上にSIOD依存が激しいようですね。基本的な方針には賛成なので > > > すが、util.scmのSRFI-1互換関数を復活させるのには少し躊躇しています。 > > > iterate_listsが空リストをうまく扱えていないような気がします。以下のような > > > バグも有ったり。こう変更すると動かなくなるのですがね...という訳でtrunkの方 > > > のiterate_listsをもう一度見直して頂けると嬉しいです。 > > > > こりゃ恥ずかしいバグですね。r1274で修正しておきました。どうもです。 > > > > しかし、この修正は以下のようなリストが1つだけのケースを高速化す > > るだけの影響しか与えません。 > > > > (filter positive? '(0 -1 2 -3 4)) > > > > 元の(uim_scm_length(lists) == 1)のコードではこの高速実行パスがい > > つでも無効になっていただけで、実行自体は正常でなければおかしいで > > す。コードを見直してtest-uim-utils.scmにもテストを追加してみまし > > たが、特におかしなところは見つかりませんでした。 > > > > 確実におかしな結果になるテストケースはありますか? > > > > > Index: uim-util.c > > > ============================================================ > > >======= --- uim-util.c (リビジョン1271) > > > +++ uim-util.c (作業コピー > > > @@ -508,7 +508,7 @@ > > > uim_lisp elms, rest, rests, mapped, res, termp, pair, > > > form; uim_bool single_listp; > > > > > > - single_listp = (uim_scm_length(lists) == 1) ? UIM_TRUE : > > > UIM_FALSE; > > > + single_listp = (uim_scm_c_int(uim_scm_length(lists) == > > > 1)) ? UIM_TRUE : UIM_FALSE; > > > res = seed; > > > if (single_listp) { > > > rest = uim_scm_car(lists); ------------------------------- ヤマケン yamak****@bp*****