タプル関係の実装をした

ローカルタプル

rowlのタプルは非ボックス化型とした。
こんな感じで書くと、レジスタもしくはスタック上にタプルが構築される。

x : (1, (2, 3));

ボックス化したいときはC++のnewのように明示的に書くことにする(syntaxなど考え中)。

パターンマッチング

タプルの中身取り出すときはパターンマッチで取り出す。

x      : (1, (2, 3));
(_, y) : x;
(z, _) : y;

とかくとyが(2,3)、zが2で初期化される。

x          : (1, (2, 3));
(_, (z, _)): x;

のようにネストしたパターンもOK。
タプルの特定の値を書き換える構文はまだ作っていない。下のようなのにすれば新しい記号とか用意しなくて良いかな。見た目ダサいけど・・・。

x : (1, (2, 3));
x = (_, (4, _)); (% x内の2を4に書き換える %);

最適化

可能ならばタプルはレジスタ上に展開される。あとdeadcode eliminationも実装した。
以下のコードをコンパイルすると

export
main: () {
    x      : (1,(2,3));
    (_, y) : x;
    (z, _) : y;

    syscall(1, z);
}

こうなる。なかなか賢い最適化が可能になった。

.text
.global main
main:
        pushl %ebp
        movl %esp, %ebp
        movl $2, %ebx
        movl $1, %eax
        int $128
        leave
        ret