クロージャ

ふひー
やっとこのコードが通った
10時間くらいかかった

require leaf;

fun foo( n: int ): fun ( int ): int
{
	fun( m: int ): int { n * m; };
}

fun main(): int
{
	var f = foo( 3 );
	puti( f( 4 ) );
	0;
}

クロージャに封じてある自由変数の数とか
呼び出し側にはわからないので
どこかでキャストする必要があるのだが、
ジェネリックなポインタとしてOpaque*を
使おうとして
OpaqueType::getの返値が一意でないのに
はまった
Opaque*ってこういうときに使うもんではないのね
でvoid*使おうと思ってPointerType(VoidTy)
ってやろうとたしたら
それもだめだ、PointerType(Int8Ty)を使え、
とか言われた
わかりづらいんでアレだけど
やむなくそれに


LLVMの型チェックきついよー
ライブラリ内部でassertするから
どう間違ってるのか調べるのが大変


そんなときは.cppファイルをソースから持ってきて
ライブラリより先にリンクしちゃう
これでプリントデバッグもデバッガもOK


まあ型チェックのきつさのおかげで
だいぶバグ減ると思うから悪くはないんだけどね
でもアセンブラ見れば型がどう間違ってるかわかるはずのに
assertしてソース出力してくれなかったりすると
余計わかりづらい気がしなくもない!


だからつまりコード生成ライブラリの時点で
余計なASSERTしなくていいと思うんだ
どうせアセンブラが型チェックするんだし


と思ったけどLLVMのコード生成ライブラリは
直接バイナリもはけるからそうもいかないのであった


でも、コード生成ライブラリが通したのに
アセンブラがはじいたことがたまにあった
アセンブラの型チェックの方が厳しいらしい


そういやメモリ管理のこと何も考えてない!
クロージャだけリファレンスカウントにしたいんだけど、だめかな?