Re: Два дурацких вопроса по примеру реализации for
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 25.05.07 13:39
Оценка: +2
Здравствуйте, FDSC, Вы писали:

FDS>Есть такое

FDS>
FDS>macro for(init, cond, change, body) 
FDS>syntax ("for", "(", init, ";", cond, ";", change, ")", body) 
FDS>{ 
FDS>  ... 
FDS>} 

FDS>


FDS>Чего-то я не понял, где вообще найти, как определяются границы body. Т.е. если там будут какие-то макросы или ещё что-то, где закончится body и начётся новый блок кода, уже не входящий в параметры макроса. А так же где находятся ограничение на применяемые символы в строках syntax, т.е. что нельзя писать внутри syntax, например syntax(",", "{") точно нельзя...


на место body будет подставлено выражение, следующее напосредственно за ")".


FDS>Второй вопрос

FDS>Пытался для развлечения определить свой макрос, по типу for
FDS>
FDS>    macro forAll(j, j0, je, body)
FDS>    syntax("forAll", j, "=", "[", j0, ";", je, "]", body)
FDS>    {
FDS>        for(mutable j = j0; j <= je; j++)
FDS>        {
FDS>            body;
FDS>        }
FDS>    }
FDS>


FDS>Пишет "Error 1 unbound type name 'IMacro'. Unbound type name 'Nemerle.Compiler.Location'. Unbound type name 'Nemerle.Compiler.Location'. Unbound type name 'PExpr'. Unbound type name 'SyntaxElement'. Unbound type name 'Typer'. Unbound type name 'SyntaxElement'. Unbound type name 'PExpr'. Unbound type name 'GrammarElement'. Unbound type name 'SyntaxElement'. Unbound type name 'SyntaxElement' F:\Prg\BarCalculator\Current\BarsCalculator\CalcProcessor\Численные методы\СЛАУ\MGauss.n 12 5 CalcProcessor"


FDS>В чём тут дело?


Во-первых, надо включить в референсы Nemerle.Compiler.dll. Во-вторых, у тебя неправильный код. Такой макрос должен возвращать что-либо типа PExpr, а у тебя вообще непонятно что делается. Надо бы юзать список и квазицитирование. В-третьих, на месте j0 и je будут не int'ы, а PExpr'ы. Надо их вручную обходить (тут поможет паттерн-матчинг, ещё надо учитывать, что синтаксиси декомпозиции AST похож на синтаксис квазицитирования) и проверять, чтобы в них были значения, вычислимые в compile-time. Или ты не этого пытался достичь?
... << RSDN@Home 1.2.0 alpha rev. 672>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.