Lispにマップリテラルが無かった本当の理由
Common LispやSchemeでハッシュテーブルリテラルが無いのには理由がある。最大の理由は、「ハッシュテーブルを再現するには、各要素だけでなくハッシュ関数および比較関数の情報が必要」という点だろう。
http://blog.practical-scheme.net/shiro/20100219-map-and-equivalence
一般的なクロージャのポータブルなリテラル表記は無いので、これらの関数が自由に指定できる場合、ハッシュテーブルのリテラル表記がいつでも可能とは限らない。
http://blog.practical-scheme.net/shiro/20100219-map-and-equivalence
アプリケーションが決まればハッシュ関数と比較関数は固定されることが多いだろうから、そしたらリードマクロを使ってリテラル表現を自由に決めてください、ってのがたぶんCommon Lispの立場。例えば比較関数をeql決め打ちで
{ :foo => 1 :bar => 2 }なんてのをハッシュテーブルとして読み込む、とかいうコードはすぐ書ける。
http://blog.practical-scheme.net/shiro/20100219-map-and-equivalence
なんだ,結局マップリテラルなんて要らなかったのか.Schemeでもdefine-reader-ctorがあればできるしな.
ところでClojureはマップリテラルを持っている。その理由は、Clojureではオブジェクトの同一性よりも値の同一性の方がはるかに重要なので、比較関数を = に決め打ちしてしまってもほぼ問題にならないから。
http://blog.practical-scheme.net/shiro/20100219-map-and-equivalence
デフォルトの何かがあって簡単に書けるのは悪いことじゃないと思うけど,sorted-mapみたいなので比較関数をパラメタライズしたいとか言い出したらこうはいかないと思うけどなぁ.まぁそれ以前にwriteしてreadしたらsortedじゃなくなったりするからあれだけど.