caper

サイト移転

Google HomePage Creatorが閉鎖ということで Google Code Project Hostingを直接使って 説明サイトにすることにしました。 以後はこちらでよろしくお願いします。http://caper.googlecode.com/svn/trunk/caper/site/caper.html 他のも移しますが、 meshtoyは…

reduce/reduce コンフリクト

ソースを見てみたところ、 reduce/reduceコンフリクトでは 先に書いたルールを優先しているようです。 (おぼろげながらそのようなコードをわざわざ書いた覚えがあるし、 それっぽいコードが存在している。偶然ではない) のでそれが仕様、そうならなかったら…

レポジトリは更新

Javaジェネレータで、パーサ等を ネステッドクラスでまとめてくれるバージョンをいただいたので レポジトリを更新しました。

作業開始

とりあえずいただいたソースがgccでもVCでも コンパイルできることを確認一応レポジトリの方は更新しておきました 生成されたソースを読む へーjavaってinterfaceのimplementsをその場でやったりできるのか問い合わせが生じたのでリリースは遅れることに。

バージョンアップ

caperをバージョンアップしました。※重要※ 前回の修正が不十分でした。異なるルールで同じアクションを指定していたときに誤動作していたのを修正しました。 thx to gachiさん

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

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

結構でかいバグ

caper 更新しました。ダウンロードページ※重要※ 9月14日のコードで、異なるルールで同じアクションを指定していたときに誤動作していたのを修正しました。

例外処理

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

バージョンアップ(2008-09-14)

caperをバージョンアップしました。 変更点は 出力コードのインデント等を美しくした 出力コードの重複部分などの無駄を最適化 ※重要※ postの返値を 「accept || error」にしました。従ってエラーチェック ( parser.error() ) はループ脱出後に行う必要があ…

スキャナ

http://d.hatena.ne.jp/higepon/20080912/1221232779 スキャナかあ 私が昔schemeのインタプリタ書いたときは SJISとEUCくらい読めればよかったんで おおざっぱにハードコーディングしてた こんな感じで: letter [\x00-\xff] kanji ([\x80-\xff]{letter}) ide…

構造体と構造体リテラル

構造体実装した。 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…

名前

いま気づいた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

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