id:lethevertさんからもトラックバックで、「Erlangのとても困ったところ」(「単一代入」と「階層的パッケージ」)にご指摘をいただきました。
これは単一代入のせいではないですよ。
そうではなくて、Erlangの = は代入ではなくてパターンマッチだということからくる問題です。
これは例えば:
がうまくいかないのは、(2)のところで 1 = 2 (1と2のマッチング)が失敗するせいだ、ってハナシですよね。そんなメカニズムにより結局は変数の書き換えが禁止されることを「単一代入」という言い方をするんじゃないの?
X = 1, % (1) Xはここで初出
X = 2, % (2) 2を代入したい
Prologに関しては、そんな感じで「単一代入」を使っていたような気がするんだけど…(ガサゴソ)… 今はとうてい手に入りそうにない金田悠紀夫・著『Prologマシン』(森北出版、1992)に(ブラケット内は檜山):
[Prologが]他言語と異なるのは[箇条書き1から3を省略] 4. 変数への代入は未定義変数に対して1回だけ行われる単一代入方式であること。
なんて記述がありました。Erlangのマッチングって、Prologと同じようなもんじゃないの?
パッケージに関しては:
それは言いがかりです。Javaだって同じ仕様ですよ。
これは「言いがかり」といわれてもしょうがないですね。というのも、Erlangの仕様に不整合も理不尽さもありませんから。僕が何も調べずに試してみて、ムッとしたのは、根拠のない先入観があったせいです。それは:
- 自分が作ったモジュールが、名前空間のルートに配置されるとは思わなかった。
- io:*、lists:* などが自由に使えるのは、システム付属のライブラリは暗黙にインポートされるからだと思っていた。
- io:*、lists:* を上書きしてないのに、何で見えなくなるんだ? ムカッ!
「mymoduleが.mymoduleと同じ」とか、「-import(io)すればいい」とかは、後から知ったことです。はい、早とちりで感情的になり失礼しました。