機能追加をどう扱うべきか
nmoshには近々Lua風のテーブル機能を導入する予定で、expanderに手を入れていくつかの構文を追加しようとしている。
問題になるのは、構文を追加するときにどうやって他のSchemeと区別するかというところ。例えば、キーワード構文は他のSchemeとは互換性が無いため、それを示す方法論が必要になる。
(テーブル機能)
nmoshに導入したいテーブル機能は、平たく言えばいわゆる連想配列機能で、それにアクセスするための専用構文を用意する。
テーブルは、物理パケットから生成したり、スレッド同士のやりとりのために使用される。
(define t (make-table)) (hoge: t 10) ; tのhogeに10をset (hoge: t) ; 10を返す
ここでのhoge:はキーワードであり、nmoshではコロンで終わるシンボルを禁止して特別な機能を持たせることにする。
R6RSではhoge:(コロンを含む)も有効なシンボルであるため、nmoshのこの機能ではR6RSの機能を一部削っていることになる。
Readerに対するフラグ
R6RSでは、ソースコード中に#!r6rsという特殊なコメントが含まれていたら、ソースコードをR6RS準拠のものとして扱うという決まりがある。例えばmoshにはmosh固有の正規表現リテラルが存在するが、他のR6RSには無いので、#!r6rsの書かれているコードに正規表現リテラルが含まれていたらエラーになる。
よって、構文を追加するならこれを新たに規定する(#!nmoshのようなものを作る)ということが考えられる。しかし、これを実装するためにはreader側に手を入れる必要が有るので、moshとnmoshが分岐している現状では好ましくない。
特殊なライブラリを作る
そこで、フラグに代えて、特殊なライブラリ(nmosh)をimportしたらnmoshの機能を有効にするというルールを考えた。これはmosh側の変更は無くて済み、かつ、既存のスクリプトと衝突することも無い。ライブラリ(nmosh)は、(rnrs)を含み、かつnmosh固有のライブラリも含む。よって、通常のシチュエーションでは、単に(import (nmosh))と書けばnmoshの一般的な機能が使えることになる。
しかし、この方式はR6RSのライブラリ機構と比べると一貫性が無い。常識的なシチュエーションでは、
(import (only (nmosh)))
のようなライブラリから何もimportしない記述は意味が無いが、nmoshでは意味が有ることになってしまう。