Макрос, изменяющий синтаксис
От: vaskir Россия vaskir.blogspot.com
Дата: 14.01.16 19:42
Оценка:
Пытаюсь сделать макрос наподобие forindex отсюда
Автор(ы): Чистяков Владислав Юрьевич
Дата: 18.08.2011
Во второй части статьи о макросах Nemerle речь пойдет о макросах уровня выражения, о макросах, изменяющих синтаксис языка, а также о контексте компиляции, доступном в макросах, и тех возможностях, которые он предоставляет (типизации выражений, получении доступа к описанию типов проекта, информации о методах и т.п.).
.

macro RangePattern(body)
syntax ("cond", "(", body, ")") {
    SandboxImpl.DoTransform(Macros.ImplicitCTX(), body)
}

module SandboxImpl {
    public DoTransform(typer: Typer, body: PExpr) : PExpr {
        Macros.DefineCTX(typer);
            
        if (body is <[ $minExpr < $val < $maxExpr ]>)
        {
            <[ $val > $minExpr && $val < $maxExpr ]>
        }
        else
        {
            Message.Error(body.Location, $"Syntax error '$body'"); 
            <[ () ]>
        }
    }
}

Тест:
module Test {
    x(): void {
        def y = 
            def foo = 45;
            def x =  cond (1 < foo < 4);
        }
    }
}


Выдаёт ошибку "Error: Unbound name `foo`". Видимо, $val надо как-то преобразовать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.