YamaKen
yamak****@bp*****
2005年 9月 23日 (金) 09:53:15 JST
ヤマケンです。反応遅くなってすいません。 At Wed, 21 Sep 2005 11:33:04 +0900, mover****@hct***** wrote: > 反応が多大に遅れてすいません。 > 空き時間を利用してパッチを検証させて頂きます。 > > > 詳細な doc を含めてあるし、差分自体も結構でかいので、簡潔に。 > > -評価器の改造は完了といえる > > -いくつかの関数はまだ新しい interface を利用してない (後方互換性で動かし > > てる) これらはこれから少しづつ変更。 > > -テストは元から通ってたのは全部通る > > -最近のコミットと少し衝突するかも (uim-commit ML 経由で届いたパッチが壊 > > れてたので確認不能) 一通り変更点を確認してみました。非常に見通しの良いコードに生まれ 変わっていてすばらしいです。井上さん、おつかれさまでした。 以下に要望を挙げておきますが、基本的な仕組みには全く不満は無いの で太田さんさえ良ければ一旦井上さんの区切りのいいところでcommitさ せてもらいたいと思います。井上さんのアカウントがすぐ発行されるか 太田さんが確認の上commitする時間が取れればそれにこした事はないで すが、そうでなければ私がやっておきます。 * evalまわり 私と井上さんの間で関数呼び出しのための'wrapper'に関する話が噛み 合ってませんでしたが、コードを見て納得しました。責任分離モデルが 違っていたためです。 私の方は要望に書いたように元々は引数のevalをなるべく個々の関数の 側に持っていきたいと考えていて、そのためにcall()に相当する関数で は関数の型に応じたdispatchが主な責任と想定していました。しかし実 際のコードを見てみるとcall()はevalと密接に関係していて、とても dispatchの責任だけを分離できるようなものではありませんでした。こ れをlibsscmユーザに関数呼び出しAPIとして提供するためにはevalに関 連した要素を隠す必要があり、確かにScm_invoke()のようなwrapperが 必要です。私は最初のモデルに引きずられてdispatcherを生で呼ぶ事を 想定していたので、これに対するwrapperがapply以外に存在する事に思 い至りませんでした。 現在は井上さんのモデルを理解してますので、その上で要望です。 - 関数呼び出しを指す用語として'invoke'と'call'が混在してますが、 妙な誤解の元になるので統一した方がいいと思います。Scheme的には 'call'の方がいいんじゃないでしょうか - call()は単なる関数呼び出しというよりは、evalループの一部として 関数呼び出しフォーム全体のevalを担当しています。なので、名前も それを反映してeval_calling()とかeval_invocation()としてみては どうでしょうか。R5RSによると()で囲まれた呼び出しフォームの事は combinationと呼ぶそうですが、この名前では他のコードとの関連性 が示しづらそうです - SCM_EVAL_STATE_NO_TAIL_RECは認識上SCM_EVAL_STATE_TAIL_RECと紛 らわしいのでSCM_EVAL_STATE_NESTとかにしてみませんか? * reduceまわり - 'SCM_BINARY_OPERATOR'は単発の二項演算のためのタイプと誤解され やすいので他の名前の方がいいと思います。いい名前が思い付きませ んが、とりあえず候補としてSCM_FUNCTYPE_REDUCER、 SCM_REDUCTION_OPERATOR、SCM_REDUCE_HANDLERあたりを - reduce()はsupress_evalを受け取るようにしないとapplyやmapが正常 に動かないと思われます(これから手を付けるのかもしれませんが一 応) - define_comparator -> マクロなのでDEFINE_COMPARATORに * その他 - ScmOp_siod_eql()は必要です。SIODの=は(= foo 'sym)等の比較も可 能ですがR5RSは数値のみ - sigscheme.c: RFC: Should we implement these as type-checking macros that directly call Scm_RegisterFunc()? No. 現在の形の方が不正形式の関数が入り込む隙が無くて良いです。 コードサイズも条件次第でマクロの場合より小さくできると思います - Scm_RegisterFunc()の第2・第3引数を入れ替えたい Scm_RegisterProcedure*()等との整合性、及び引数中継コードの最適 化のため。IA32で実測 4バイト/1関数 減少 ------------------------------- ヤマケン yamak****@bp*****