Иногда хочется просто дампнуть текст — у меня, например, студия не установлена, и я пишу в емаксе. В любом случае, я нафигачил простенькую реализацию на рефлекшне. Кстати, приятно писать на Немерле — все базовые привычки после сишарпа работают. А вот к Скале мне пришлось пару дней привыкать =)
using System;
using System.Linq;
using System.Text;
using System.Console;
using System.Reflection;
using System.Reflection.BindingFlags;
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;
class Helper
{
public static Render(this exprs : list[PExpr]) : String
{
def buf = StringBuilder();
buf.Append("[");
mutable first = true;
foreach (expr in exprs)
{
if (first) { first = false; }
else { buf.Append(", "); }
buf.Append(expr.Render());
}
buf.Append("]");
buf.ToString();
}
public static Render(this expr : PExpr) : String
{
def buf = StringBuilder();
def t = expr.GetType();
buf.Append(t.Name);
buf.Append("(");
mutable first = true;
foreach (f in t.GetFields(Public | Instance | DeclaredOnly))
{
if (first) { first = false; }
else { buf.Append(", "); }
buf.Append(f.Name);
buf.Append(" = ");
def v = f.GetValue(expr);
if (v is PExpr) buf.Append((v :> PExpr).Render());
else if (v is list[PExpr]) buf.Append((v :> list[PExpr]).Render());
else buf.Append(v.ToString());
}
buf.Append(")");
buf.ToString();
}
public static Dump(this exprs : list[PExpr]) : void
{
WriteLine(exprs.Render());
}
public static Dump(this expr : PExpr) : void
{
WriteLine(expr.Render());
}
}