Scheme

最近はSchemeを触っているのだが、何でも出来る言語はその分だけ可能性を考慮しなくてはならないために使いにくくなるのではないかと思う。
大概のプログラミング言語チューリング完全(というよりもチューリング完全でなければプログラミング言語として失格)であるのだから、あらゆるアルゴリズムを記述できる。即ち一つの言語で書けるプログラムは原理的に全ての言語で書くことが可能である、ばんざい。
もちろん、原理的に〜可能というのは曲者だ。言語Aでその問題を解くのに一番手っ取り早いやり方というのは、もしかしたら、言語Aの上に実装したlispを使うことなのかもしれない。「だったら言語Aを使う必要はない、はじめからlispで書け」という意見も一理あるが、「言語Aを一時的に拡張しlispのように扱えるようにする」という意見も良いのではないか。つまり、メタプログラミングだ。
しかし、メタプログラミングが出来るという利点は、構造から意味が予測できないという欠点でもある。別の人間がそのコードを理解するためには、ちょうどコンパイラインタプリタがそうしているように、メタコードを逐一展開して解釈するほかないだろう。
もちろん、展開・解釈が容易でコストが問題にならないのなら構わないのだが、仕様の間隙を縫って想定されている以上の機能を引き出そうとする人たちが危険なのだ。いわゆる黒魔術的な手法の大半は言語が想定していない機能(多くはメタプログラミングだ)を強引に仕様の範囲内で記述した結果作られたものだ。初めからメタプログラミングに対応した言語ならば遥かにシンプルに書けるはずだ。
ただ、少々面倒でも安全な言語の方が私の趣味には適っている。安全にメタプログラミングを行うというのは可能なのだろうか、現在考察中。