Jun Inoue
jun.l****@gmail*****
2005年 8月 22日 (月) 06:11:33 JST
ヤマケンさん、素晴らしいです。私が前からひっかかっていた点をほとんど網羅 されていますね。提案の内容には概ね賛成です。いくつか意見と追加要望を。と いっても相互に依存しあっててうまく切り分けられないので、散文形式で行きま す。ちなみにヤマケンさんの提案よりも小うるさくて受け入れづらそうです (汗 SCM_NIL, SCM_EOF などの特殊オブジェクトについて。SCM_NIL を例にとりま す。 #define SCM_NIL (&SigScm_nil_impl) に変更しませんか? これに伴って QUOTE, UNQUOTE などの組み込みシンボルの初期化を変更する必要 が出てきますが (でないと毎回 Scm_Intern() を呼ぶ羽目になる)、そのために symbol 周りのコードを datas.c から専用のモジュール (symbol.c) に移し ます。symbol table の保護は vector オブジェクト一つで足りるでしょう。 直接的なメリットは SigScm_nil の消費ワードの解放と、NULLP が定数比較にな ることぐらいですが… sigscheme.h / sigschemetype.h の他に、SigScheme 内部でだけ使用する sigschemeinternal.h を用意しましょう。主な動機は ・一部のアクセッサはどの道 private 扱い ・sigassert() しない CAR が欲しい ・SigScheme 内では prefix は邪魔 ・いくつかの関数を内部で export したい の四点です。 一つ目については、SCM_SETFREECELL_CDR などです。これらは公開する必要が全 く無いので、相応に扱いたいと思います。 二つ目は sigassert() の役割がよくわからないからなのですが、これは (a) NDEBUG と独立に on/off を切替えられる assert() →非デバッグ版の SigScheme をアプリ A のデバッグ版に組み込むときのサポート (b) 非デバッグ版でも nop にならない assert() (c) その他 のどれのつもりですか? 少し前に sigassert() を nop にしてみた事があるんで すが、生成ライブラリのサイズは 40KB ほど減り、ベンチマークの成績は 5-15% ほど向上したように記憶しています。(a) か (b) のためのものなら、 assert しない accessor は有用だと思います。特に (b) の場合は、SigScheme 自身のバグ検出という位置づけになると思われるので、SigScm_Error() を呼ば ずに abort() する事も検討してください。低レベルのデバッグはコアダンプの 方が高水準なエラーメッセージより便利ですので。 prefix については大いに異論もあることと思いますが、私の考えとしては CAR, CDR, EQ などあからさまに Scheme 用語なマクロに prefix をつけるのは 冗長で、for loop などの可読性を低下させると思っています。FALSEP や NULLP など、C の用語とややこしいものは prefix がついていてもいいと思いま すが、NIL など、用語を変えるだけで区別できるものは積極的に lisp legacy を利用すれば良いと考えています。無論これは 100% 主観ですので、気に入らな ければ無視してください。黙って従います。 内部で使用したい関数とは、具体的に env 系と ScmOp_c_length など、生の情 報を Scheme オブジェクトにくるまずに返す関数です。SRFI などを C で実装す るときにこれらは結構役に立つと思います。libtool を使わない組み込みかたも サポートするなら、外から見えなくするのが無理かも知れませんが。 -- Jun Inoue jun.l****@gmail*****