error(expr.loc, "unimplemented")
end
-
-
def make_typevar()
@typevar ||= 0
var = "abcdefghijklmnopqrstuvwxyz"[@typevar]
env[func.name][:value]
end
-# def check_apply(env, expr, type)
-# # Handle global functions that haven't been typed yet but are
-# # being called. We pause to infer their type.
-# if untyped_global_func?(env, expr.func, type)
-# value = env[expr.func.name][:value]
-# env[expr.func.name][:value] = nil
-# infer(@parser.syms, value)
-# type = infer(env, expr.func)
-# end
-#
-# error(expr.loc, "object being applied is not a function (has type: #{type.to_s})") if not type.is_a? Array
-# error(expr.loc, "wrong number of arguments to function call") if (type.length - 1) != expr.args.length
-# type[0..-2].each_with_index do |t,i|
-# check(env, expr.args[i], t)
-# end
-# expr.type = type.last
-# end
-#
-# def check_ifexpr(env, expr, type)
-# check(env, expr.cond, :bool)
-# check(env, expr.then, type)
-# check(env, expr.else, type)
-# end
-#
-#
-# def verify(cond, loc, msg)
-# error(loc, msg) if not cond
-# end
-#
-# def check_func(env, expr, type)
-# env = env.clone
-# verify((type.length-1) == expr.args.length, expr.loc,
-# "incorrect number of arguments (#{expr.args.length}, expected #{(type.length-1)}")
-# expr.args.each_with_index do |a,i|
-# env.add_sym(a.name, a.loc, :arg, type[i])
-# end
-# check(env, expr.expr, type.last)
-# end
-#
-# def check_let(env, let, type)
-# env = env.clone
-# env.add_sym(let.var.name, let.var.loc, :var, let.var.type)
-# check(env, let.expr, type)
-# end
-
-#
-# def infer_let(env, let)
-# if let.body.nil?
-# infer_decl(env, let)
-# else
-# infer_let_expr(env, let)
-# end
-# end
-#
-# def infer_decl(env, let)
-# env = env.clone
-# # handle the binding
-# if let.var.type
-# check(env, let.expr, let.var.type)
-# else
-# let.var.type = infer(env, let.expr)
-# end
-# env.set_type(let.var.name, let.var.type)
-# env[let.var.name][:value] = nil
-# let.type = :void
-# end
-#
-# def infer_let_expr(env, let)
-# env = env.clone
-#
-# # handle the binding
-# if let.var.type
-# check(env, let.expr, let.var.type)
-# else
-# let.var.type = infer(env, let.expr)
-# end
-#
-# env.add_sym(let.var.name, let.var.loc, :var, let.var.type)
-# let.type = infer(env, let.body)
-# end
-#
-# def infer_ifexpr(env, expr)
-# check(env, expr, infer(env, expr.then))
-# end
-#
-# def infer_set(env, expr)
-# error(expr.loc, "infer_set unimplemented")
-# end
-#
-# def assign_type(env, var, type)
-# if var.class == IR::Var and (var.type.nil? or var.type == String) then
-# var.type = type
-# env[var.name][:type] = type
-# end
-# end
-
-
def check_unary(env, expr, vtype)
optype = UnaryOps[expr.op][TypesToBase[vtype]]
error(expr.loc, "unknown unary operation '#{expr.op}' for operand type #{vtype}") if not optype