soutaroのHaskellにっき

2008-02-02

[]構文を考える 構文を考える - soutaroのHaskellにっき を含むブックマーク はてなブックマーク - 構文を考える - soutaroのHaskellにっき

構文を決めます.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

idが識別子の型です.ここでは単純にstringです.

literalは即値(literals)の型.文字列と整数と文字があります.文字列はリストがあれば必要ありませんが,とりあえず入れておきます.

exprが式の型です.変数(Var),リテラル(Lit),関数適用(App),関数抽象(Abs),Let式(Let)などがあります.残りは普通の二項演算子

letbindinglet 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モジュールに興味があるかたは実装を読んでも良いと思います.