Kazuki Ohta
mover****@hct*****
2005年 8月 27日 (土) 03:55:57 JST
太田です。 とりあえず今までの意見を参考にまとめてみました。 まずは単純に引数を定数個取る関数型 * FUNCTYPE_1 * FUNCTYPE_2 * FUNCTYPE_3 * FUNCTYPE_4 * FUNCTYPE_5 末尾再帰を考慮された関数型 * FUNCTYPE_EVALED_LIST - 説明 - map_evalして作ったリストをargsに渡し、envには現在の環境を渡す - 関数宣言 ScmObj func(ScmObj args, ScmObj env); * FUNCTYPE_RAW_LIST - 説明 - 評価しない状態の引数のリストをargに渡し、envには現在の環境を渡す - 関数宣言 ScmObj func(ScmObj args, ScmObj env); * FUNCTYPE_RAW_LIST_TAILREC - 説明 - 評価しない状態の引数のリストをargに渡し、envpには現在の環境へのポインタを渡す この型の関数は返り値として生のS式を返し、これによって末尾再帰を実現する この関数内で環境が変化した場合は *envp=env; のように新しい環境を セットしてからreturnする - 関数宣言 ScmObj func(ScmObj args, ScmObj *envp); * FUNCTYPE_RAW_LIST_WITH_TAILFLAG - 説明 - 評価しない状態の引数のリストをargに渡し、envpには現在の環境へのポインタを渡す さらに、第三引数としてintへのポインタを返す この関数の返り値はtail_flagによってかわる - (*tail_flag) = 1とセットした場合 - この型の関数は返り値として生のS式を返し、これによって末尾再帰を実現する - (*tail_flag) = 0とセットした場合 - この型の関数は評価した後の値を返し、末尾再帰は行わない この関数内で環境が変化した場合は *envp=env; のように新しい環境を セットしてからreturnする - 関数宣言 ScmObj func(ScmObj args, ScmObj *envp, int *tail_flag); 一つ悩んでいる事としては、FUNCTYPE_EVALED_LISTとFUNCTYPE_RAW_LIST第二引数 が ScmObj *envp じゃなくて良いかどうかです。この型の関数で環境をいじるものがあったらどう しよう...という心配です。まぁ、とりあえず実装してみた方がよいかも。 こんな感じで如何がでしょうか? # 今日はLLDNに行きます。メッチャ楽しみです。 ------------------------------------------------- Kazuki Ohta : mover****@hct***** -------------------------------------------------