(原文: Keyword-symbol integration)
嗚呼、もう五月か。 信じられない。 最後の追い込みは長いマラソンだということがわかりました。
GitHub のレポジトリ https://github.com/shirok/Gauche を見ているならそれが積極的に開発されていることは知っているでしょうが、ほとんどの変更はマイナーな修正です。 0.9.4 リリースのために私が最後に記載した項目をクリアし、一大項目「キーワード」を残して実現しました。
Gauche は他の型と分離したキーワード型を持っています。 STk からそれを継承したと思います。 Common Lisp について話すと :keyword を持つことは RnRS 仕様と競合することを忘れがちほど自然です。 RnRSでは、それらはシンボルでなければなりません。
実際、 srfi-42 を採用したときに : で始まるシンボルが使用されていて問題になりました。 アレックス・シンは問題を回避するために、マクロ展開時に巧妙なトリックを採用しました。
今、もっと多くのR7RSライブラリが出てくると、この設計が大きな障害となると予期しています。
キーワードを持っているいくつかの実装はシンボルとは異なる構文を採用することでこの競合を回避しています。 例えば #:keword といったようなものです。 実際、私の当初の計画はキーワードの構文をカスタマイズ可能にすることでした。 :keyword, #:keyword あるいは keyword: (DSSSL スタイル、誰か覚えていますか?) などです。 それがキーワードの名前スロットにコロンを持っていない理由です。 しかし、これらの構文の混合は混乱しただけで、私は :keyword をやはり強く好んでいます。 #:keyword は、シンボルと競合しないというメリットがありますが視覚的にあまりにもでしゃばりだし、 CL と Gauche では unintern symbol として使用されています。
技術的にはキーワードをシンボルから分離する必要はありません。 確かに CL でキーワードはキーワードパッケージに属するだけのシンボルです。 我々はちょうどそれと同じように出来ます。
これは私には合理的に見えます。 いくつかのひっかかりがありますが、それはマイナーなものでしかなく簡単な迂回路があります。
しかしながら、この変化は特定の場合の後方互換性を破壊する必要があり、それは少し複雑ですが判明しました。 後ほど説明します。