/// <summary> /// トップレベル関数のコンパイル /// </summary> /// <param name="type_builder">Type Builer</param> /// <param name="topfun">トップレベル関数</param> static void CompileTopFun(TypeBuilder type_builder, MTopFun topfun) { // 引数型の決定 var arg_types = new List<Type>(); foreach (var arg in topfun.Args) { arg_types.Add(arg.Type.Reduce()); } // メソッドの定義 var builder = type_builder.DefineMethod( topfun.Name, MethodAttributes.Static, topfun.RetType.Reduce(), arg_types.ToArray()); _function_table.Add(topfun.Name, builder); // コード生成 var ilgen = builder.GetILGenerator(); _scope_manager.StartScope(); var index = 0; foreach (var arg in topfun.Args) { _scope_manager.Add( topfun.Pos, arg.Name, new ParamVar(index)); index++; } CompileStmt(ilgen, topfun.Body); ilgen.Emit(OpCodes.Ret); _scope_manager.EndScope(); }
/// <summary> /// トップレベル関数の型推論 /// </summary> /// <param name="stmt">トップレベル関数</param> static void TypeinfTopFun(MTopFun stmt) { var ret_type = new TypeVar(); var func = new FunctionInfo(stmt.Args, ret_type); function_table.Add(stmt.Name, func); current_function = func; env.StartScope(); foreach (var arg in stmt.Args) { env.Add(stmt.Pos, arg.Name, arg.Type); } TypeinfStmt(stmt.Body); env.EndScope(); if (func.RetType.Reduce() == null) { Unification(stmt.Pos, new DotNetType(typeof(void)), stmt.RetType); } else { Unification(stmt.Pos, func.RetType, stmt.RetType); } }