パターンマッチ
コンパイル技法: パターンマッチ
型DB:「bool 型にはコンストラクタ true と false がある」のような情報を記録する
パターンがどの種類かを調べる必要があるfn pattern_type(&self) -> PatternType
Optimizing Pattern Matching
static exceptions
exit, catch l1 with l2
catch l1 with l2のl1でexitが実行されると、l2を評価する
ジャンプへ変換できる
Compile(catch l1 with l2) ->
Compile(l1)
goto RETURN
LABEL_L2:
Compile(l2)
RETURN:
Compile(exit) ->
goto LABEL_L2
switch
コンストラクタのタグごとに分岐
default節が無いものを特にswitch*と書く
match x with | p1 -> e1 | p2 -> e2 … | pm -> em->
code:initial call
catch
C((x), (
p1 -> l1
p2 -> l2
... -> ...
pm -> lm
))
with (failwith "Partial match")
lis are the translations of the eis
Clasical scheme
C((), (_ -> l1, ...)) = l1
when there are no more columns
C(x, P -> L) = C((x2, x3, ..., xn), P -> L')
P -> L' = (..., p_2^u ... p_n^u -> let (yu x1) lu, ...)
all patterns in the first column of p are variables, y1, y2, ..., ym
C((x1, x2, ..., xn), P -> L) = switch x1 with case c1: r(c1), ..., case ck: r(ck), default: exit
S(c, P -> L) = コンストラクタcから始まるパターンのみを展開したC
r(c1) = C((y1, ..., ya, x2, ..., xn), S(c, P -> L))
ynはx1の各フィールド
C(x, P -> L) = catch C(x, P1 -> L1) with C(x, P2 -> L2)
P1 -> L1はP -> Lの最大のプレフィックス(first columnが同一のもの)
mixture rule
Out Compilation Scheme