Koriel
Malgoコンパイラの中間表現
二つの言語に分かれる
Koriel.Core
現行の中間表現
明示的なキャストとletを持つλ計算の拡張
Koriel.Coreの問題点
明示的なキャストを使って型変換を常に正しく扱うのは難しい
Malgo → Coreのパスでは、Any#はあらゆる型に代入可能であってほしい
Core → LLVMのパスでは、AnyTはi8*とのみ等価であってほしい
cast忘れでとにかくバグる
castが必要なところは簡単にわかるはずだから、自動で挿入して欲しい
多相関数も再帰型も全部cast
fold/unfoldのcastと、∀のためのcastがごっちゃになっている
T(data List a = Nil | Cons a (List a))
translated to (sum (Nil) (Cons Any# Any#)))
and cast to Any#
https://scrapbox.io/files/61290e1dca3745001de4b2a9.png
メモリ操作のタイミングが不透明
Letでallocとstoreが、Matchでgepとloadが実行される
ポインタを介した操作しかないので、構造体値がうまく扱えない
alloc, store, fetchが欲しい
Callが4種類もある
Call : クロージャの呼び出し
クロージャのpack, unpackとCallDirectの組み合わせであるべき
CallDirect : 関数の呼び出し
ExtCall : declare & 外部関数の呼び出し
declareと関数呼び出しは別れているべき
RawCall : 生シンボルによる関数の呼び出し
CallDirectで置き換え可能なはず
bindが難解
デバッグ出力が読みにくい
match expr1 with x -> expr2 を束縛として扱っている
x <- expr1; expr2 のような形であるべき