実際に、ボイラープレートコードやパターン傾向にあるコードを書く必要性にしばしば出会います。 一般には (ある種の) メタプログラミングを使ってそのようなコードを生成します。 そのため、プログラミングの生産性を向上させるだけでなく、手動によるコード作成によって生れるバグを防止できます。
ATS コンパイラが宣言したデータ型の値に対する関数のコードを生成できることを次に示します。 次は説明に使うデータ型です:
// datatype expr = | Int of int | Var of string | Add of (expr, expr) | Sub of (expr, expr) | Mul of (expr, expr) | Div of (expr, expr) | Ifgtz of (expr, expr, expr) // if expr > 0 then ... else ... | Ifgtez of (expr, expr, expr) // if expr >= 0 then ... else ... //
あるデータ型が与えられたとき、datcon 関数はそのデータ型の値を取り、その値をコンストラクトした (最外の) コンストラクタの名前を表わす文字列を返します。 データ型 expr の datcon 関数の生成を (ATS コンパイラに) 指示するのに次の命令を使えます:
デフォルトでは、生成された関数の名前は datcon_expr になります。 もし異なる名前にしたければ、#codegen2 命令の第三引数にその名前を渡します。 例えば、次の命令は my_datcon_expr の名前で関数を生成することを示しています: 名前 expr.dats のファイルが (トップレベルの宣言として) 次の命令を含むと仮定しましょう: また expr の定義が codegen2 命令が宣言された位置でアクセス可能でなければなりません。 次のコマンドラインを実行すると: datcon_expr を実装した ATS コードの出力が得られます:(* ****** ****** *) // implement {}(*tmp*) datcon_expr (arg0) = ( case+ arg0 of | Int _ => "Int" | Var _ => "Var" | Add _ => "Add" | Sub _ => "Sub" | Mul _ => "Mul" | Div _ => "Div" | Ifgtz _ => "Ifgtz" | Ifgtez _ => "Ifgtez" ) // (* ****** ****** *)
この章で示した例の全体と (コード生成のプロセスを説明する) Makefile は オンライン から入手できます。