Была проблема с синтаксисом def! x = y. Наверное автор уже как-то её решил, но меня она заинтересовала, и я написал макрос, который позволяет использовать данный синтаксис.
Идея в том, чтобы обрабатывать в макросе оба варианта: обычный def и def с восклицательным знаком. Недостаток, соответственно, в том, что для каждого def’а компилятор вызывает макрос. Поскольку львиную долю времени ncc все равно проводит за типизацией, падение в скорости вряд ли будет ощутимым.
Вот, собственно, код:
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;
namespace DefMacro
{
public macro @def(expr) syntax ("def", expr)
{
match (expr)
{
| <[ !($x) = $y ]> => { DefImpl.DefineExclamation(x, y) }
| <[ $x = $y ]> => { PExpr.Define(x, y) }
| <[ $_error ]> => { Message.Error("expecting `def x = expr' or `def f () { .. }' or def! x = expr"); <[ ]> }
}
}
module DefImpl
{
public DefineExclamation(name : PExpr, value : PExpr) : PExpr
{
PExpr.DefMutable(name, value) // это заменяем нужным кодом
}
}
}