2008-08-01から1ヶ月間の記事一覧

ローカル関数

なんとかローカル関数を実装した。 無理矢理っぽくてあんまり納得いかないけど。 自由変数を本物の引数の前に並べるような 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のサンプルにもなっています。 まだ全然見所のない言…

いいことを思いつきました

フラッシュの上に透過pngを表示できるそうです ですので、グーグルストリートビュー上で 二次元美少女とデートできるアプリを作ってください。 よろしく>id:kikuty君 ちゃんとカスタマイズできるwebアプリにするんだよ こんなのもあるみたいだし

追記

よく読んでないけど割と簡単にいじれそう http://d.hatena.ne.jp/tek_koc/20080808/1218181787

だからといって

C++のstd::mapでみつからなかったときに 例外throwしたりしたら私だって怒りますよ! だって受け取るの超めんどくさいんだもん でも std::map< std::string, std::string >::iterator i = m.find( "abc" ); if( i == m.end() ) { s = "default"; } else { s …

ハッシュ

するってえと、非破壊的に nil と notfound を区別したいときでも hash.fetch('key0') rescue hash.fetch('key1') rescue hash.fetch('key2')とかってやればよかったのか こういうことをしたかったのにうまくできなくて困った覚えがある よくできてるな (ope…

ruby is 超神

rubyのrescue修飾子! 私が「LLで何かやれ」といわれたときに選ぶのはrubyである rescueという予約語は初見でない ことを鑑みるに、「知っているのに完全に忘れていた」可能性が非常に高い! ということは↓の思考プロセス自体誘導されている可能性が高い! M…

ruby is 神

もっとも、try〜catchの何がいやかって、 ruby的な意味で aでみつからなかったらbでみつからなかったらcっていうような思考プロセスを踏んでるのに ネスト構造を強いられることなので、 それがない f() ||->(NotFound) g()は想像するほどめんどくさくはない…

一方

しつこく例外バージョンについても考えてみる。 例外全部拾っちゃうのはどう考えても危ないので、 例外ヒエラルキーを再編成して class demivalue; template < class T > class concrete_demivalue<T> : public demivalue {}として A ||-> Bを try { eval A; } </t>…

とここまで考えたとき

耳元で誰かがささやくのであった「キャリーフラグ……」

一般化を考えてみる

例外なしで考えてみる 1. A ||->f B = (bool)A ? f(A) : B とか? 2. A ||-> B = (bool)A ? A() : B でA()はオーバーロードとか? 3. A ||-> B = (bool)A ? (typeof(B))A : B でキャストをオーバーロードとか? 4. A ||-> B = (bool)A ? get(A) : B でgetを…

うーん?

はてなマークアップがおかしいな

perl is 神

このお話について http://www.kmonos.net/wlog/88.html#_2233080818 http://d.hatena.ne.jp/gnarl/20080820に一票。 以下全部勝手な妄想で 上のお二人のおっしゃっていることもわかってないかもしれません、 と前置き↓ ちょうどコンパイラ作ってて k.inabaさ…

CAPER

Makefileとかおかしいのでレポジトリの方を多少修正。 まだおかしい気がするけど

前から思ってたんだけど

Vista64 ST3320613AS raid0 P5K-E Xeon 3G で CrystalDiskMark Seq 140前後 って遅いよねえ? 何が悪いのかわかんない…… ジャンパピンは外してあるよ

とりあえず型式のパースだけするようにした 無視してるけど んで char 8bit short 16bit int 32bit long 64bit にした。 C#ってこうだったよね? んで型システムはLLVMのそのまま使おうかとも思ったけど たぶん後で困ると読んだので 似たようなものを自作。

require

C++でプリミティブな関数を書くのは もう勘弁願いたいので RTLは外部の.llに追い出してアセンブル・リンクすることにした。 すると関数宣言のrequireが必要になったので実装。 いまのところ普通に動いている。 標準関数の実装が簡単になったので 文字出力関…

キャスト

型システムを取り入れようかと思うんだが キャストとかどうしようかなー 今最高にかっこいいキャストってどんなかな? 暗黙の型キャストとか全廃したほうがいいよね バグの温床だから cast(v)とか好みだけど scannerに厳しいからどうしようかなあ どなたか、…

|| &&

shortcut || &&を実装した。 うーんあほほど長くなるな。当然だけど。 結局定数のときとか、最適化すれば消えてくれるんだけど、 どう考えても効率悪いよな。 先に消しといた方がいいんだろな。 デバッガのこと考えるとそうでもないか…… まあともかく、fibが…