kwatchさんから「よくわかりません」というツッコミをもらいました。
「プログラマーのためのプログラマー日記」の最終日*1にも同様のことを書いておられたのを読んではいたのですが、 「もう少し解説してほしい」と頼まれれば、書くしかないでしょうね。
まず、「数学の概念とあまり合致しない」という点ですが、それはたぶんあまり重要ではないと考えています。 私が数学苦手なせいかもしれませんが。
そもそも数学の概念を持ち出しちゃうと、 プログラミング言語の代入って許せないものじゃないですか。
x = x + 1
とかありえないわけですし。よって数学における変数や代入のイメージに厳密に沿うと、
という関数型言語みたいな代入と変数しか許容できないような気がします。
え? 「そういう意味じゃない、そこまでは言ってない」ですって?
そうでしょうとも。では、「数学における変数や代入のイメージ」とはどんなものでしょう。
変数とは「関数のパラメータ」か「一時変数」であり、 「値(計算の途中結果)」に後で参照できるために名前をつけたものでしょう。 また、代入とは「値」に名前をつける行為です。
つまり、これは名札モデルです。 kwatchさんの直観とは反対に、名札モデルは数学の概念に合致しているわけですね。
たぶん、kwatchさんは「数学における変数や代入」という言葉で違うものをイメージしていらっしゃるとは 思うのですが、そのイメージは普遍的なものではないかもしれません。
「同じ説明は箱でもなりたつだろう」という指摘があるかもしれません。 もっともです。
問題は箱は名札と違って名前と強く結びついていないと言う点です。 現実世界の箱はむしろ入れ物としての性質が強く、変数よりもオブジェクトに近い性質を持ちます。 実際にCやC++では箱はオブジェクトです。
これを変数の説明に使ってしまうと後でオブジェクトと変数の区別が難しくなるんじゃないかと 心配しているんです。余計な心配かもしれませんが。
追記:
なんかフォローもらってますね。残念なことにどれもよくわかりませんでした(脳力が足りない?)。
Lisp だと箱に相当するのはシンボルでしょうか?
伝統的なLispのグローバル変数はそうでしょうね。
しかし、たとえ伝統的Lispでもローカル変数だと環境リストに格納されちゃうんで、 実装も名札モデルですよね。
「値に名前をつけたものが変数」というのは変ではないでしょうか。 実行時のある時点の文脈においてはそのように見えるかもしれませんが、 私の感覚だと「仮の名前(変数名)をもつ、後に与えうる未来の値が変数」というか。。
えー、なんで変なのかな。プログラム上のどこの地点で考えるかによるのでしょうか。 「仮の名前をもつ、後に与えうる未来の値」ってことは宣言した地点で考えているように 思われるのですが、Rubyには宣言はないしなあ。
名札モデルだと、代入っていうのは、名札を付け替えるのに相当するのでしょうか? これって、変数aとbがリファレンスで同じものを指していて、 b=1としたときに、aも1になるような場合の説明が難しいのではと思います。
えーと、C++にはリファレンスがあるのでそういうことが起きますが、 「もっと良い言語」であるRubyではそういうことは起きませんよね。 今は、Rubyの変数の話ですから、C++のリファレンスについて考える必要はないと思います。
CやC++の変数は確かに「箱+名札モデル」で説明するのがよかろうとは思いますが。
*1 「プログラマーのためのプログラマー日記」、終わっちゃったんですね、残念。