人間コンパイラコンパイラとLispのマクロ

C++を使っていると、関数型言語の人には、「そこまで(Boost.Lambdaみたいなことまで)して関数型に近づける努力をするくらいならC++をやめて関数型言語使えばいいじゃん」 と言われることがありますが、それは全然違うよ、と思うのです。

まさに自分はそういうことをよく言う派の人間なのですが、後の方で書かれている「Powerfulな言語の人間コンパイラコンパイラとなる」というのは、それはそれでよく分かります(例えば次のエントリなんかもその一つ)。そして、その場合Lisp系の言語ではマクロという非常に強力な機能があって、これが自分がSchemeを使っている大きな理由の一つになっています。
Schemeの(というかLispの)マクロは、その表現力と言語本体との親和性の高さが他の言語とは一線を画していて、相当変なこと(例えば元の文法を根本的に変えてしまったり)でも、割と自然に書くことができます。極端に言うと、通常の関数を定義する気安さで新しい文法を一つ作れるようなものです(Schemeのマクロ定義はそのものずばりdefine-syntaxという名前になっています)。使ったことのない人には理解しにくいかもしれませんが、もし仮にLispにマクロがなかったとしたら、それはユーザが関数を定義できないC言語みたいなものだと言えば、おそらく使いにくくてしょうがないということが分かってもらえるでしょう。だからこそSchemeのマクロが楽しいわけです。