星田さんの記事に対するコメント。
これはだな。
実はここに書いてた話と同じなんだわ。
あるいはここに書いてた話と同じ。
ANSI Common Lispだったらこう書けるケースだ。
このコードを走らせると星田さんがやりたいような事、つまり変数名の自動生成が出来る。
しかしこれを実現する為に、ANSI Common Lispにはsymbol-valueと言う関数があるが、生憎これに当たる関数がSchemeにはないんだ。
個人的に言うと、ここがSchemeの仕様の最大のミステイクじゃないか、って思ってる。
要は、Schemeの場合、一旦シンボルにクオートを噛ますとそれを外す手段がない。一方、ANSI Common Lispの場合、シンボルにクオートを噛ましてもsymbol-valueやsymbol-functionで束縛されてる値を取り出す事が出来るんだ。
ANSI Common Lispの場合、シンボル自体が構造体で作られたようなデータ型になっていて、複数のスロット、つまり、値を保持するスロットや関数を保持するスロットを持っていて、symbol-valueやsymbol-functionと言うようなアクセサ関数を備えている。
一方、Schemeにはそれがない。ハッキリ言っちゃえば、どうしてCLerが「SchemeはLispにあらず」と言うのか、ってのはそれが原因だ。Schemeのシンボルは内側にデータ構造を持ってなく、クオートしてしまえば自在にデータを取り出す事が出来ない。そして言っちゃえば、この不都合のせいで、マクロを書く自由度さえ低下する、って事がある。
星田さんの発想は間違ってない。しかし生憎、現時点で知ってる限り、「変数名を自動生成出来るプログラミング言語」なんつーのはANSI Common Lispしかないんだ。
さすがのSchemeでもこの辺だとANSI Common Lispには敵わないわけだ。
じゃあどうすればいいんだろ?SchemeやPythonで考えられる代替手段は、それこそ連想リスト/辞書型/ハッシュテーブルを用いて擬似的にキーワードと値として束縛してしまえばいい、ってのが一つの答えだ。
これは連想リストの例だけど、ハッシュテーブルなら「破壊的変更」前提だとこうすればいい。
以上。