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
}