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