プログラミング言語をオレオレ拡張できる汎用マクロプロセッサ作った
■概要
シンプルでパワフルなマクロプロセッサを開発しました。C++のテンプレートライブラリやLispのマクロのようにプログラミング言語を拡張してソースコードの抽象化を進めコーディングを劇的に効率化することができます。
もともとサンプラーソフトKONTAKTの内蔵言語KSPを効率的に書くために作りましたが、それに限らず低機能な言語を拡張するために使用できます。
■簡単なサンプル
シンプルなマクロの例。以下は、Javaで書かれた典型的なHelloWorldプログラムです。
public class Sample { public static void main (String[] args) { System.out.println("Hello World!"); } }
上記コードで固有の部分はクラス名のSampleと文字列リテラルの"Hello World!"の部分だけで、それ以外は定番的な記述です。この定型部分をマクロ定義したら以下のように書けるようになります。
include "macro.lib" Class Sample Puts "Hello World!" EndClass
マクロ定義はこんな感じ。&1, &2, ……の仮引数は展開時に実引数に置き換えられます。
defmacro Class public class &1 { public static void main (String[] args) { endmacro defmacro Puts System.out.println(&1); endmacro defmacro EndClass } } endmacro
もっともJavaの場合は普通Eclipseを使うので単語の長さや定番的な記述の多さはあまり気にならないかもしれません。
他にもBrainf*ckのような難読言語を以下の様にわかりやすく書くようなこともできます。
defmacro inc + defmacro dec - defmacro input , defmacro print . defmacro shift > defmacro unshift < defmacro while [ defmacro wend ] ## inc while shift input print unshift wend
■説明
マクロ自体は、アセンブラの時代から存在する古典的な手法で、Unix系OSにはたいていM4というツールが入っているし、C言語では#defineなどの構文をCPPプリプロセッサが処理します。C++ではboostのような強力なテンプレートライブラリがあります。他にもウェブフレームワークのテンプレートエンジンやCoffeeScriptのようなソースを他の言語に変換する言語もコンセプトとしては近いものがあります。
しかしながら、シンプルで気軽に使えて環境や対象言語に依存しないマクロプロセッサは意外に少ないように思います。そんなわけで汎用的に使える自分用のマクロプロセッサを作りました。200行程度のAWKスクリプトなのでマクロプロセッサ自体を自分用に拡張するのも簡単です。
記述能力の高いモダンな言語やチーム開発にはあまり向いていませんが、HTMLやCSSあるいは各種定義ファイルで毎回同じような記述をしたり、DRYに書けなくて似たような箇所がソース中に複数あるような場合はマクロを使うことで楽になるかもしれません。
ダウンロードはこちらから。
http://github.com/aike/macra