Chapter 29. コード自動生成

Table of Contents
datcon 関数の生成
datcontag 関数の生成
fprint 関数の自動生成

実際に、ボイラープレートコードやパターン傾向にあるコードを書く必要性にしばしば出会います。 一般には (ある種の) メタプログラミングを使ってそのようなコードを生成します。 そのため、プログラミングの生産性を向上させるだけでなく、手動によるコード作成によって生れるバグを防止できます。

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 関数の生成

あるデータ型が与えられたとき、datcon 関数はそのデータ型の値を取り、その値をコンストラクトした (最外の) コンストラクタの名前を表わす文字列を返します。 データ型 expr の datcon 関数の生成を (ATS コンパイラに) 指示するのに次の命令を使えます:

#codegen2("datcon", expr)

デフォルトでは、生成された関数の名前は datcon_expr になります。 もし異なる名前にしたければ、#codegen2 命令の第三引数にその名前を渡します。 例えば、次の命令は my_datcon_expr の名前で関数を生成することを示しています:

#codegen2("datcon", expr, my_datcon_expr)

名前 expr.dats のファイルが (トップレベルの宣言として) 次の命令を含むと仮定しましょう:

#codegen2("datcon", expr)

また expr の定義が codegen2 命令が宣言された位置でアクセス可能でなければなりません。 次のコマンドラインを実行すると:


patscc --codegen-2 -d expr.dats

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" ) // (* ****** ****** *)

この出力を fprint_expr.hats ファイルに保存したければ、次のコマンドラインを使えます:


patscc -o fprint_expr.hats --codegen-2 -d expr.dats

生成されたコードを正しくコンパイルするために、関数テンプレート datcon_expr がどこかで宣言される必要があることに注意してください:

fun{} datcon_expr : (expr) -> string // a function template

この章で示した例の全体と (コード生成のプロセスを説明する) Makefile は オンライン から入手できます。