leaf

LLVM2.4ちょっと試してみた

これとこれ なおってねーじゃんかチキショー LLVM IRではFirst Class Aggreateをフルサポートしました! でもCodeGenではサポートしてません ってそんな! ポインタ渡しにしたほうがよさそうだ

例外処理

例外処理を実装しようと目論む。 …… 何もオブジェクトをthrowしないで フロー制御するだけなら何も考えずに書けるようだけど、 オブジェクトをthrowしようとすると そうもいかないらしい。 少し考えねば。 llvm.eh.exceptionを使ってどっかよくわからん場所…

構造体と構造体リテラル

構造体実装した。 require leaf; struct Foo { x: char; y: short; z: int; w: long; }; fun main(): int { var foo = Foo { x = 13@char; y = 75@short; z = 46@int; w = 2@long; }; 0; }こんなソースが ; ModuleID = 'test' declare i32 @puti(i32) declar…

キャスト

キャスト演算子を@にしてしばらく書いてみたけど アセンブリみたいでキモい foo as int とかにしようかと思ったけど asみたいな短い文字列を変数名に使えないのはハマりそう foo cast int かなあ でもいまいち意味が取りづらい foo => int とか? うーん foo…

遅延評価

遅延評価をデフォルトにすると リアルタイムプログラミングと折り合いが悪すぎると思ってるので scheme R5RSみたいに Promiseの作成は明示的 Promiseの起動は暗黙 って感じがいいかなと思ってます。 正確に言うと、R5RSでは、作成(delay)は明示的だけど 起動…

というわけで

leafもそういう方向性で進めたいわけですが、 OOとはどう折り合いをつけるのかな…… 前にOCamlでコンパイラ書いたときも gensymとintern以外破壊的操作を行わない縛りで作業したんだけども、 ASTや functional intermediate representation に ちょっとした情…

名前

いま気づいたleafってエロゲ屋の名前じゃねえか シナプスが全く結合してなかった まいいやいまから変えるのめんどくさい

多値

struct返しにしてもだめなもんはだめだった ジェネレータの問題みたいだからほっとくしかないか 手動にしてもいいけど 私の勘違いかもしれないし そのうち直るかもしれないから 別のことやるか lli -force-interpreter=true t.bcってやったら lli: Interpret…

多値続き

ググったらBugzillaでなんかやってたX86のABIでレジスタが余ってなかったらだめとかなんとか 他にもいろいろ問題あるみたいで 要するに多値はまともに機能してなさそう 実装変えるか

多値

超必死こいて多値の実装をしていたわけですが、 よくみたらLLVMの多値( Multiple Return Value => MRV )って 2.3で新しく入った機能なのね!!! でもって、 require leaf; fun foo( n: int ): int, char { n, n@char; } fun main(): int { var a, b = foo(3…

 クロージャ

ふひー やっとこのコードが通った 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; }クロージャに封じてある自由変数の数とか 呼び出…

返り値の型とキャスト

今まで手抜きで関数の返値の型を全部Int32Tyにしてたのを ちゃんと型宣言を見てつけるようにした。 そのテストにあたってchar, longなどの値を生成する必要がでたので、 キャスト演算子"@"を実装した。 でも Expr '@' TypeExpr ていう文法にしようとしたら r…

ローカル関数

なんとかローカル関数を実装した。 無理矢理っぽくてあんまり納得いかないけど。 自由変数を本物の引数の前に並べるような lambda-liftingしただけなので、 関数が定義されたスコープを抜けたらコール不能になる。 (引数として使う自由変数の存在が保証でき…

変換

うーむなんだか関数型中間表現変換 入れた方がいいような気がしてきた ASTからダイレクトにLLVMに持ってくのは この辺が限界のような気もする クロージャのエスケープ解析とか入れたい でもSSA作る手順が関数型中間表現作る手順に似ていて 同じことするだけ…

自由変数の収集

自由変数の収集はたいしたことなかった 以前OCamlでやったときは結構めんどくさかったような気がするが あれはOCamlの練習も兼ねてたので 破壊的操作をしないという掟を己に課していたせいだな C++でやったら 10行くらいの追加ですんだ (その分ソースが不自…

うーん

問題の依存関係的に分割ができねー 気合い入れて全部同時に実装するしかない

と思いきや

意外と簡単に直った気がするが よくわからん テストコードいっぱい書くしかないな

あっ

型推論の実装が中途半端だったの忘れてた つっても現状関数が型省略を許してないし、 変数の初期化以外の代入文もないから 推論するところほとんどないな あっ うーん 変数の型推論のアルゴリズムが間違ってる 結構面倒だな 関数型IRみたいな構造になってれ…

さて次はどうしよう

無名関数の前に ローカル関数かな〜 LLVMの仕様だとlambda liftingすることになると思うので とりあえず自由変数の検出かしら。 というか何するにしても 自由変数の検出は必要か。 じゃあそれにしよう。

デザイン予定

leafのデザインは以下のような雰囲気で 進めていく予定です。 強い型付け c系の字面 デザインの美しさと使いやすさがコンフリクトしたときは使いやすさをとる。 perl/ruby的なスタンス あくまで道具。 強い型も「自分に必要な道具だから」つける。 関数型言…

今の文法

ちなみに現在の文法はこんな感じです。 なんだかんだで結構大きくなりつつありますね。 エラートラップ用の文法も含まれているので、実質的には もうちょっと小さいですが。 バグって変な動作をするたびに「caperのせいかな?」と疑って ビクビクしながら使…

分岐

phiとかいうの使えばよかったのね 書き換えよう

チェックアウト

subversionのレポジトリはバンバン更新しますが アーカイブの方はあまり更新しないと思います。 従って、leafで遊ぶなら subversionでチェックアウトした方がよいかと思います。 匿名チェックアウトは svn checkout http://caper.googlecode.com/svn/trunk/ …

google code view

グーグルユーザーならサインインしてればツッコミ入れられるみたいです。 プロジェクトの設定にありました。 匿名はむりみたいですけど。

caper 新バージョン+おまけでleaf公開

caperの新バージョンをアップロードしました。 Makefile、VC++のプロジェクトを微修正して 若干コンパイルしやすくしました。 あとおまけで'leaf'(LLVM用修作コンパイラ)を追加しました。 caper, capellaのサンプルにもなっています。 まだ全然見所のない言…

Nemerle...

今日初めてNemerleという言語を知った。 私の作ろうとしてる言語、そっくりじゃん……モチベーション激しく低下ああ.Net用か、では割り切って方言のつもりで作るか……

注目中のもの

xtal んでもって現在私が注目しているのはこの方の日記です。xtalの仕様を見ると、「1ヶ月早く知っていればわざわざ自分でコンパイラなんぞ作らなかったのになァ」という、よい感じのバランスになっているようです。とはいえもう自分のコンパイラもだいぶ作…