クロージャ
ふひー
やっとこのコードが通った
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のコード生成ライブラリは
直接バイナリもはけるからそうもいかないのであった
でも、コード生成ライブラリが通したのに
アセンブラがはじいたことがたまにあった
アセンブラの型チェックの方が厳しいらしい
そういやメモリ管理のこと何も考えてない!
クロージャだけリファレンスカウントにしたいんだけど、だめかな?