S式で書くOCamlマクロに関する基本的なことこのS式OCaml(仮)のマクロには大きく分けて2種類のマクロが存在します。構文木をコンパイル直前に操作するマクロです。R5RSマクロ)がこれに該当します。呼ばれる機能が存在します。set-macro-characterなどがこれに該当します。ソースコードを扱うことも可能になります。完全なScheme」という点です。OCamlコンパイラによって実行コードへとコンパイルされます。R5RSで定義されたSchemeマクロです。マクロに渡されたパラメータのトークンの並びでパターンマッチさせる高水準のマクロです。以下に簡単なマクロのサンプルを紹介します。関数が値を受け取るのに対し、マクロは式そのものを受け取ります。y)))この例では2種類のパターンが列挙されており、下のパターンが適用され展開されています。マクロに渡された「add」がマクロのパターンにおける「name」に該当します。...」に該当します。...」というのは1つ以上の式を表しますので、2以上の式が与えられた場合でも下のパターンが適用されます。式の数が0だった場合にのみ、上のパターンが適用されます。普通の関数ではパラメータとして受け取れないような要素もパラメータ化することが可能です。以下の例はモジュールを生成するマクロですが、マクロがモジュール名をパラメータとして受け取ることで、擬似的にfunctorのように振る舞います。Lispのdefmacroのような伝統的なLispマクロです。低水準で自由度の高いコード生成を可能にします。必要な分だけソースコードを読み込んでS式を返します。S式を返したあとは、リーダが残りのソースコードの解析を続行します。現在リーダマクロを定義する手段は以下の2つです。Lispの同名のset-dispatch-macro-characterと同じような機能です。Lispと異なりmake-dispatch-macro-characterは不要です。(後者にはset-macro-character2という別名も用意してあります)以下に簡単なリーダマクロのサンプルを紹介します。定義することで、以下の二つは同じ意味として解釈されるようになります。})S式のカッコは現在2種類のカッコが利用可能です。以下のリーダーマクロを定義することで、角カッコをカッコとして使えなくなる代わりにOCamlのリテラル記法に近い形でlistやarrayを記述可能になります。(print_newline))sample_ar))(print_newline)マクロから別のマクロを展開することも可能です。定義されている「list-int」を展開しています。これでHaskellのような等差数列のlistの記述が可能になります。(print_newline))sample_ls))(print_newline)以下のコードはPerlの正規表現リテラルを真似たものです。リーダーマクロを利用することで言語のコアに手を加える事無く、プログラマの手によるリテラルの拡張が容易に行えます。match!!\n"))リーダーマクロは強力ですが、従来のマクロ以上に混乱を招きやすいので慎重に扱う必要があります。ちなみに、以下が入力ポートからソースコードを読み込む関数です。読み込んだソースコードを文字列やlistで返します。それが正しいマクロ定義の式であれば正常に動作します。マクロを生成するマクロを書く事も可能です。デバッグが困難なものになる可能性が高いですのでご注意ください。