見出し画像

Retro-gaming and so on

RE: Racketで何か 四人のキング01 準備1

星田さんの記事に対するコメント。

これはだな。
実はここに書いてた話と同じなんだわ。
あるいはここに書いてた話と同じ。
ANSI Common Lispだったらこう書けるケースだ。


Schemeでのsymbol->string及びnumber->string代わりにformatを使用している。また、internと言うのはSchemeで言うstring->symbolだ。
このコードを走らせると星田さんがやりたいような事、つまり変数名の自動生成が出来る。


しかしこれを実現する為に、ANSI Common Lispにはsymbol-valueと言う関数があるが、生憎これに当たる関数がSchemeにはないんだ。
個人的に言うと、ここがSchemeの仕様の最大のミステイクじゃないか、って思ってる。
要は、Schemeの場合、一旦シンボルにクオートを噛ますとそれを外す手段がない。一方、ANSI Common Lispの場合、シンボルにクオートを噛ましてもsymbol-valuesymbol-functionで束縛されてる値を取り出す事が出来るんだ。


ANSI Common Lispの場合、シンボル自体が構造体で作られたようなデータ型になっていて、複数のスロット、つまり、値を保持するスロットや関数を保持するスロットを持っていて、symbol-valuesymbol-functionと言うようなアクセサ関数を備えている。
一方、Schemeにはそれがない。ハッキリ言っちゃえば、どうしてCLerが「SchemeはLispにあらず」と言うのか、ってのはそれが原因だ。Schemeのシンボルは内側にデータ構造を持ってなく、クオートしてしまえば自在にデータを取り出す事が出来ない。そして言っちゃえば、この不都合のせいで、マクロを書く自由度さえ低下する、って事がある。
星田さんの発想は間違ってない。しかし生憎、現時点で知ってる限り、「変数名を自動生成出来るプログラミング言語」なんつーのはANSI Common Lispしかないんだ。
さすがのSchemeでもこの辺だとANSI Common Lispには敵わないわけだ。

じゃあどうすればいいんだろ?SchemeやPythonで考えられる代替手段は、それこそ連想リスト/辞書型/ハッシュテーブルを用いて擬似的にキーワードと値として束縛してしまえばいい、ってのが一つの答えだ。



これは連想リストの例だけど、ハッシュテーブルなら「破壊的変更」前提だとこうすればいい。


以上。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「RE: Racketで何か」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事