概要はcwmにあります。
前提
- Gaucheを仮定して、仕様を書く。Gauche以外のプログラム処理系に対して適用する場合は、その点を考慮して読解する事。
初期仕様
- それは、<cwm-1>クラスのインスタンスである。以下これを「インスタンス」と呼ぶ。
- インスタンスは、内部に、metadataと呼ばれるメタ情報のkeywordsと、contentと呼ばれるコンテント本体、の二つを含む。これらはどちらも、write/read invarianceの保証されたS式の内部表現のみで構成されるものとする。これらはインスタンスのスロットとして保持/アクセスする。
- define-reader-ctorを使って、インスタンス自身のwrite/read invarianceを保証する。これによって、インスタンスは、別のインスタンスを内包する事が可能となる。
- その際の表記は「#,(<cwm-1> ...)」となる。
- 続きはあとで書く
途中で、仕様を書くのが面倒&書きながら考えた方が効率が良さそうなので、先に実装してしまった。
備考
ここには、採用しない事にした仕様の事等、現バージョンでは不要となった情報だが、次バージョンを構築する際に参考にできる情報を記述する。
- metadataは当初alistであったが、便利さを優先して、keywordsにする事にした。
- インスタンス更新の手続きは当初、副作用無しの更新をするもののみだったが、結局、破壊的更新をするものと、副作用無しの更新をするものの、両方を提供する事にした。
ライセンス
- この仕様自体はPublic Domainとする。
- 以下の実装については、Gauche本体と同じく、BSDライセンスとする。
実装
パッケージ
リポジトリ
リファレンス
まだ
サンプルコード
あとで
作った感想
- アクセサの名前付けに時間がかかった。
- パッケージ名が「cwm-1-0.0.0.tgz」となって、ちょっとわかりにくい。
- アクセス性は想定していたよりもまあまあ良い。
- Gaucheのオブジェクトシステムを使って実装したが、オブジェクトをwriteした結果を見てると、「別に素のlistでいいんじゃないか?」という気がものすごくしてくる。
- 当初はそれも考えていた(というか、memo.cgiでは素のlistで実装している)がどうしてGaucheのオブジェクトシステムにしたのかというと、「今、この変数に入ってるものは、cwm書式のlistなのか、それとも別用途のlistなのか」という点を素早く認識できたほうがいい、という事だった。
- しかし、オブジェクトシステムを採用した為に、Gauche以外のS式処理系への互換性が悪くなる、速度がやや落ちる、等のデメリットもある(自分の使う用途では、これらのデメリットの影響は大きくないので無視したが)。
- もし、素のlistで実装するのなら、「(tag content . metadata)」という形式のlistにするのがよいだろう。tagは、cwm-X形式のlistであるという事を示すシンボル(か何か)。
- 本格的にこのモジュールを使い出す前に、この方針で作り直すべきかどうかはちょっと迷う。
- 素のlistで実装した場合のデメリットは、object-applyの扱いが難しくなる事。
- <list>に対するobject-applyとして実装すればよい、が、それだと他のlistに対してもobject-applyが適用されてしまう。
- 以上の方針で作り直す!
- ……と考えていたが、ちょっと方針を変更する。作り直す事は作り直す。詳細はcwm-2にて。
最終更新 : 2009/06/02 18:57:05 JST