[Anthy-dev 2415] Re: 第二次 FUNCTYPE 大改造

Back to archive index

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*****



Anthy-dev メーリングリストの案内
Back to archive index