/// <summary> /// let文のコンパイル /// </summary> /// <param name="ilgen">IL Generator</param> /// <param name="stmt">let文</param> static void CompileLetStmt(ILGenerator ilgen, MLetStmt stmt) { CompileExpr(ilgen, stmt.Expr); var builder = _scope_manager.Lookup(stmt.Pos, stmt.Name); if (builder is LocalVar) { ilgen.Emit(OpCodes.Stloc, ((LocalVar)builder).Builder); } else if (builder is ParamVar) { ilgen.Emit(OpCodes.Starg, ((ParamVar)builder).Index); } else { throw new NotImplementedException(); } }
/// <summary> /// let文の型推論 /// </summary> /// <param name="stmt">let文</param> static void TypeinfLetStmt(MLetStmt stmt) { TypeinfExpr(stmt.Expr); var t = env.Lookup(stmt.Pos, stmt.Name); if (t != stmt.Expr.Type) { throw new MError(stmt.Pos + ": 型エラー"); } }