タグ

ブックマーク / wasabiz.hatenablog.com (5)

  • Pythonで末尾再帰最適化をする。 - IT系で覚醒めたい

    Pythonは最強ですね。文法はチョー簡単、ライブラリも充実度がすごい、それでいてメタプログラミングができる。そのメタプログラミングを使うと末尾再帰最適化までできるそうです…おそろしやNew Tail Recursion Decorator « Python recipes « ActiveState Code class tail_recursive(object): def __init__(self, func): self.func = func self.firstcall = True self.CONTINUE = object() def __call__(self, *args, **kwd): if self.firstcall: func = self.func CONTINUE = self.CONTINUE self.firstcall = False try:

  • とあるプログラミング言語処理系のセルフホスティング化に携わった - wasabizの日記

    2013-12-15 とあるプログラミング言語処理系のセルフホスティング化に携わった (この記事はJSX Advent Calendar 2013の一部として書かれました。) 僕がJSXというプログラミング言語の開発に携わってこの冬で早1年半になります。コンパイラとしてのjsxにはこの1年半で幾多の出来事がありましたが、その中でも一番巨大なものがセルフホスティングでしょう。つまりJSXのコンパイラをJSX自身で書きなおすということです。 メインラインのコードをまるまる入れ替えるこのセルフホスティングは大きな苦労を伴いました。実際、通常のポーティングとは違いコンパイラそのものを入れ替えてしまうわけですから、バグの出方などもなかなか味わい深いものです。 JSXセルフホスティングを行ってから既に1年が経過しようとしています。今までこの作業の苦労について外で話したことは無かったのですが、「プログラ

  • mrubyで限定継続(shift/reset)を実装した話 - wasabizの日記

    2013-10-03 mrubyで限定継続(shift/reset)を実装した話 mrubyという組み込み向けのruby実装があります。中身のアーキテクチャはほとんどluaに近いんですがAPIとかがとても洗練されていてソースコードが読んでいてとてもふつくしい。登場からまだあまり時間が経っておらずコードが成熟していないという事もあってなかなかハックしがいがあるソフトウェアです。今回そのmrubyに限定継続オペレータのshift/resetを実装したのでその話を書いてみます。新規性としては 限定継続は家CRubyにも実装されていない 一部の言語の一部の処理系(scheme or ML)以外での実装はほぼ存在しない "Final Shift for Call/cc: Direct Implementation of Shift and Reset"は一つのスタックの上に特殊なフレームを詰んでい

  • 限定継続の(すごくわかりやすい(かもしれない))解説 - wasabizの日記

    2013-10-03 限定継続の(すごくわかりやすい(かもしれない))解説 ** この記事はmrubyで限定継続(shift/reset)を実装した話の一部です 限定継続とは一般化された継続のようなもので、切り取るスタックの底を指定できるcallccのようなものです。といってもこうやって言葉を並べているだけだと何を言っているか全くわからないと思うのでここから具体的に説明していきます。 限定継続にはいくつか種類があるんですが、とりあえず今はshift/resetという二つの演算子(二つで一つのペアです)を説明します。 説明で使っているAPI mruby-partcontの以下のAPIを使っています。 class Continuation self[*ret] -> value call(*ret) -> value Kernel.#reset Kernel.#shift reset rese

  • JSXでダックタイピング(型消去)が出来るようになった話 - wasabizの日記

    2013-08-18 JSXでダックタイピング(型消去)が出来るようになった話 JSXにユーザーテンプレート関数と型パラメータ推論が入り、Type Erasureが出来るようになりました。これでJSXで型安全なダックタイピングができるようになりました。 Type Erasureとは 以下の様なDuckクラスとDogクラスを考えます。どちらもfunction say () : voidというメソッドを持ちますがそれらに一切の継承関係はありません。 class Duck { function say () : void { log "quack"; } } class Dog { function say () : void { log "bow"; } } ここでfunction say () : voidを持つクラスをすべてAnimalだとみなし、そのインスタンスをメンバ変数として格納した

  • 1