• ベストアンサー

LISPのマクロと他の言語のマクロの違い

LISPのマクロは強力と言われていますが、他の言語の言うマクロとはどう違うのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

ここでいう「マクロ」は一言で言うと「プログラムを生成する機能」ですね。 例えばCのマクロを例に上げますと、 #define MAX(a, b) (a) > (b) ? (a) : (b) というようなマクロを定義すると、後に MAX(10, x) と書いた際に (10) > (x) ? (10) : (x) というプログラムがコンパイル時に生成されます。 Cなどのマクロは、マクロ専用の文法があり、 マクロで書けるものにはある程度の制限が付きます。例えば、 「マクロの引数が定数の際に奇数か偶数かで『生成するプログラム』を変える」 などといった複雑なことはできません。 一方、Lispのマクロは、Lispそのもので書くことが可能で、 任意のプログラムをマクロとして書くことができます。 マクロの中で条件分岐やループなど、なんでも出来てしまいます。 これにより、コンパイル時にマクロの引数の型や値に応じて 生成するプログラムを変えることで最適化を行ったり、 新たな言語機能(と対応する文法)を追加するようなことが可能です。 例えば、昔のLispにはオブジェクト指向の機能がありませんでしたが、 マクロを使うことで、後からオブジェクト指向の機能を付け加えることができました。 また、Common Lispのオブジェクト指向の機能が独特で嫌いな人は、 マクロを使うことでJava風のオブジェクト指向の機能を追加するようなことも可能です。 極端な話、Lispの上で別の言語が作れてしまうわけです。 コンパイル時に任意のプログラムを実行できるという点では、 C++のテンプレートとも似ているといえますが、 C++のテンプレートはテンプレート専用の文法を用いる必要ある点がLispと異なります。 C++をそれなりに書ける人でも、テンプレートで任意のプログラムを書こうとすると、 かなりの苦労を強いられます。テンプレートの文法がC++の文法と異なるのが苦労する原因の一つです。 一方、Lispのマクロは、Lisp自身で書けるため、 Lispが書ける人なら誰にだって書けてしまうわけです。 以上がLispのマクロが強力と言われる要因(の一部)です。 実際に使われてみると色々と実感できると思いますよ。

nomalphard
質問者

お礼

とても詳しく書いていただきありがとうございました。 まさにベストアンサーだと思います。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

LISP で「マクロ」という名のつくものは複数思いつくんだけど, そのうちどれなんだろう. 「他の言語の言うマクロ」ってなんだろう. BASIC に「マクロ」は存在しなかったような記憶があるんだけど....

関連するQ&A