Здравствуйте, nikov, Вы писали:
N>Как это выглядит?
Играюсь с синтаксическими трансформациями C#. "quote match" — макрос для паттернматчинга AST. "quote <# #>" — макрос, согдающий ветку AST.
AstVisitor — ходилка по деревяшке. Если какая-то ветка при обходе была модифицирована, все остальные выше по иерархии будут пересозданы (процесс пересоздания автоматизирован).
internal sealed class CSharpVisitor : AstVisitor
{
public override Visit(ast : Ast) : Ast
{
def newAst = quote match (ast)
{
| <# Statement: $LocalVariableType(_) $Name(varName) = $(expr1).Where($Name(item) => $Expression(pred)); #> =>
quote <# Statement:
{
List<object> $Name(varName) = new List<object>();
foreach (var $Name(item) in $Expression(expr1))
{
if ($BooleanExpression(pred))
{
$Identifier(varName).Add($Identifier(item));
}
}
}
#>;
| <# Expression: 0 #> => quote <# Expression: 1 - 1 #>;
| x => x
}
newAst.Apply(this)
}
}