トップ «前の日記(2014-05-13) 最新 次の日記(2014-06-05)» 編集

Route 477



2014-05-14

[types][ruby] IbisをRubyに途中まで移植した

最近ちょっと型推論の実装に興味があって、IbisのRubyへの移植をやってみた。 まだ途中だけど fun x -> x * 2 くらいは推論できる。

実装は基本的にオリジナルと同じだけど、構文木についてはクラスを作らず、ArrayとSymbolでできたS式っぽいものを使っている。ビジュアライザ部分は移植するつもりはないのでこれで問題ないはず。

RubyでArray S式を扱う場合、pattern-match gemを使うと便利。こんな感じで配列に対するパターンマッチを書ける。

   def self.infer_(ctxt, env, variants, expr)
      match(expr){
        with(_[:Const, :unit]) { Type::UNIT } 
        with(_[:Const, Integer]) { Type::INT } 
        with(_[:Const, String]) { Type::STRING } 
        with(_[:Const, Or(true, false)]) { Type::BOOL } 

        with(_[:Var, varName]) {
          typeSchema = ctxt.find(varName)
          raise "undefined variable: #{varName}" unless typeSchema

          createAlphaEquivalent(typeSchema).bodyType
        }