SigScheme開発録 (31)

環境周り

最適化しようとして撃沈。以下撃沈の模様。

環境周り(撃沈その1)

Scm_ExtendEnvironment内にて、var_listも破壊的に更新するようにした。こうする事でlookup_frameのループを単純化出来ると思ったからだ。しかし実際にはvar_listを破壊的に更新してしまうと、2回目以降の呼び出し時に問題が出てしまう。例えば(define (dotarg-func x . y) hogehoge)をこの形式で呼び出すと、引数リストが破壊的に更新されてしまうために(define (dotarg-func x y) hogehoge)というように宣言自体が変わってしまう。これはボツ。これはBiglooのテストケースで判明。Bigloo万歳。

環境周り(撃沈その2)

次に試したのは、lookup_frame内でdot_listが見付かった時にCONSセルを新しく作成し、それを返すというもの。しかし、これは次のようなコードが動かない。SLIBがこのようなコードを多用していた為にたまたまテストケースに加えていた。SLIB万歳。

; set!
(define (set-dot a . b)
  (set! b '(1 2))
  (display b)
  b)

環境周り(そんで?)

結局、作業としてはlookup_frameのループをちょっと変更したぐらいか。後、Yamakenさんがletを改編した際に指摘して下さったが、Scm_ExtendEnvironmentを使用する場合不必要にdot list checkを行ってしまうという問題がある。なので、次のようにScm_ExtendArgumentEnvironmentなるものを用意しようかと思うのだが、いかがでしょうか?まぁScm_ExtendEnvironmentにフラグを付けても良いんだけれど。

ScmObj Scm_ExtendArgumentEnvironment(ScmObj vars, ScmObj vals, ScmObj env)
{
    handle_dot_list(vals);

    Scm_ExtendEnvironment(vars, vals, env)
}