Cで私の頭に浮かぶ最初の乱用は:
#define if while
しかし同時に、正しく使用すると非常に便利で強力です。
Common Lispマクロでも同様のことが起こります。
すべてのプログラミング言語がこのようなマクロをサポートしていないのはなぜですか?
彼らは有害だと考えられていますか?
Cで私の頭に浮かぶ最初の乱用は:
#define if while
しかし同時に、正しく使用すると非常に便利で強力です。
Common Lispマクロでも同様のことが起こります。
すべてのプログラミング言語がこのようなマクロをサポートしていないのはなぜですか?
彼らは有害だと考えられていますか?
回答:
言語にマクロがある場合、それらは十分に計画され、コンパイラーではなく言語の不可欠な部分である必要があると私は考えています。
たとえば、Lispのマクロシステムは非常に強力な統合言語機能であり、Lisp自体のすべての規則と規制の対象となります。
反例として、C / C ++マクロシステムは言語から分離されており、コンパイラに組み込まれています。その結果、言語の制約に限定されず、無効なコードが作成され、言語固有のキーワードが再定義される可能性があります。
結局のところ、マクロ機能を持たない言語がいくつかありますが、それらの機能はそれほど見逃されていません。それはすべて、言語がどれほど表現力豊かであり、メタプログラミングへの代替アプローチがあるかどうかに依存します。メタプログラミングは、Xを実行するときに、アプリケーション全体でXが同じ方法で実行されるようにするための方法にすぎません。
CマクロとLispマクロは完全に異なります。Cマクロは、他の処理が行われる前に、文字列置換を使用して展開されます。Lispマクロは、入力テキストが構文ツリー1に解析された後に展開され、展開中に言語全体を使用できます。Lispマクロを使用すると、のような愚かなことを実行できるだけでなく#define begin {
、独自の制御構造を定義したり、コンパイル時に、必要なコードを使用して配列にデータを追加したりすることもできます。
マクロを含めない理由の1つは、Cスタイルの構文を使用する言語では、単純な文字列置換よりも複雑なものを扱うのが非常に難しい場合があるためです。マクロに関するもう1つの不満は、マクロがコードを読みにくくする可能性があることです。これは、上手に実装されない場合に当てはまります。よく書かれたLispマクロは実際にコードを読みやすくすることができます。
1構文を作成するプロセス中に展開される読み取りマクロを除きます。