実際のところ、そこそこよくできているマクロ言語です。)などが参考になるでしょう。マクロを定義するマクロ、といったものを作れるようになっているので、最初は「手強い」と思うかもしれませんが、仕掛けは単純ですのできちんと理解すれば便利に使いこなせるツールです。Tools")の8章を参考にしました。以下、READMEにある例で、m4と異なる点を紹介します。あらゆるレキシカル要素がカスタマイズ可能m4ではクウォートの開始と終了の記号が変更できますが、m55ではマクロの開始・終了や実引数の区切りなど、あらゆる記号が変更できます。*/{m55_changebracket|[<]|[>]}<m55_changesep|[,]><m55_changepre,[@]><m55_define,[cat],[[@1@2@3@4@5@6@7@8@9]]><cat,foo,bar,baz>マクロの呼出しは明示する必要がある簡単な例から示します。world}{HELLO}上が入力、下が出力です。worldm55_defineは「マクロを定義する」という副作用がある組込みマクロで、自身は空文字列に展開されます。m4(ないしCPP)では、入力のうち識別子のように見える部分をトークンとして読み(CPPには「プリプロセッサトークン」というジャーゴンがあります)、その名前のマクロが定義されていればマクロとしての処理が起きます。そのような仕様は、意図的に名前を衝突させて、たとえば標準関数を横取りする仕掛けを簡単に仕込みたいであるとかそういう場合には便利ですが、一方でソースコード中のあらゆる識別子が、何らかのマクロによって不意に書き換えられてしまわないか、という不安がつきまといます。マクロの呼出しは明示する、というようにマクロ言語を設計すれば、「識別子のように見える部分」を常にいちいち検出することもなく、どこでマクロ展開が起きるかは一見して明らかになります。