Синтаксис в Computation Experessions
От: catbert  
Дата: 24.04.10 16:42
Оценка: 48 (1)
Была проблема с синтаксисом 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) // это заменяем нужным кодом
        }
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.