2008-02-02
■ [Haskell Hackathon]構文を考える

構文を決めます.Astの定義を見てみましょう.
$ svn cat -r 5 http://svn.soutaro.com/has/trunk/ast.ml
- r 5ってどんなだったか覚えていませんが,最初はこんな感じで定義していました.
type id = string type literal = String of string | Char of char | Int of int type expr = Var of id | Lit of literal | App of expr * expr | Abs of id * expr | Let of let_binding * expr (* Binary operators *) | Plus of expr * expr | Minus of expr * expr | Mul of expr * expr | Div of expr * expr and let_binding = id * expr type decl = Val of id * expr | Print of expr
literalは即値(literals)の型.文字列と整数と文字があります.文字列はリストがあれば必要ありませんが,とりあえず入れておきます.
exprが式の型です.変数(Var),リテラル(Lit),関数適用(App),関数抽象(Abs),Let式(Let)などがあります.残りは普通の二項演算子.
letbindingはlet x = e in exprの太字の部分のことを言います.これも,本当は関数が来たり,パターンが来たりするのですが,現時点ではこのままにしておきます.
最後のdeclはトップレベルの定義です.プログラム全体はdeclのリストになります.Valが,Haskellで
fact = ¥n -> if n = 0 then 1 else n * fact (n-1)
とか書くやつに相当します.値の定義です.Printは,ここで特別に入れた構文で,引数の式を評価した結果を出力します.Haskellには本当はこんな構文はありませんが,普通の関数として文字列を出力するやつを入れるのは,純粋関数型言語的にいかがなものかと思い,構文を新たに導入することにしました.Monadic IOまで実装したら,Printは消えます.
他にPretty Printerの定義があります.OCamlのFormatモジュールに興味があるかたは実装を読んでも良いと思います.
コメント