//最大公約数を取るテンプレートプログラム
typedef A<0> arg1;//引数エイリアス作成
typedef A<1> arg2;//引数エイリアス作成
typedef V<0> value1;//変数エイリアス作成
typedef V<1> value2;//変数エイリアス作成
//処理ブロックを定義
typedef Cons //ConsはlispのConsと同じ。内部でS式のリストを作成している。
<
Move< value1,arg1 >//arg1からvalue1へ代入
,
Move< value2,arg2 >
,
If
<
Equal< C<0>,value1 >//Ifの1引数は判定式を取る
,
Cons//処理ブロック
<
Return< arg2 >//値を返す
>
>
,
While
<
//If同様1引数目は、判定式を取る
Equal< C<0>,Div< Mod< Cons< value1,value2 > > > >
,
Cons//処理ブロック
<
Move< value2,value1 >
>
>
,
Return< value1 >
> program;//プログラムを再利用出きるよう保存する
//テンプレートを実行する。テンプレートで書いたプログラムが実行時かコンパイル時の
//どのタイミングで実行されるかはテンプレートプログラムを解釈するクラス次第。
Execute< program,Cons< C<20>,C<10> > >();
//補足:S式の定義 必要ないので宣言だけして本体は定義しない。
template<class car,class cdr> struct Cell;