macro gen(expr1:PExpr)
syntax ("gen", expr1)
{
match(expr1){
| <[$per = $value]> =>
{
def name=Macros.NewSymbol();
<[
decl: class $(name : name)
{
internal valuetemp;
}
def $per = $value;
]>
}
| _ => <[ ]>
}
Error 1 parse error near keyword `def': unexpected token after code quotation (you forget a closing bracket?). C:\Users\Администратор\Documents\Visual Studio 2008\Projects\MacroLibrary2\MacroLibrary2\Macro1.n 33 8 MacroLibrary2
Здравствуйте, <Аноним>, Вы писали:
А>Error 1 parse error near keyword `def': unexpected token after code quotation (you forget a closing bracket?). C:\Users\Администратор\Documents\Visual Studio 2008\Projects\MacroLibrary2\MacroLibrary2\Macro1.n 33 8 MacroLibrary2
1)Учись форматировать код. Это же просто ужос. А что если твой код будет поддерживать маньяк-убийца, который знает, где ты живешь?
2)Ты засунул class и def на один уровень. Так делать нельзя.
3)internal valuetemp; у тебя тоже не скомпилируется. Вывода типов для членов класса нет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Здравствуйте, Аноним, Вы писали:
macro gen(expr1 : PExpr)
syntax ("gen", expr1)
{
match(expr1)
{
| <[ $per = $value ]> =>
def name=Macros.NewSymbol();
<[ decl: class $(name : name)
{
internal valuetemp;
}
//def $per = $value;
]>
| _ => <[ ]>
}
}
А>Error 1 parse error near keyword `def': unexpected token after code quotation (you forget a closing
Здесь Вы допустили несколько ошибок, матчить выражение можно так, это правильно, далее непонятно что Вы хотите получить, вы начали квазицитатой создавать класс, в нем поле без типа, а под ним еще выражение которое я закоментировал, в классе даже в обычном коде нельзя писать выражение уровня метода def $per = $value; эту цитату надо писать отдельно. И чтобы создать класс его сконструированное значение нужно подать в функцию типа DefineNestedType или Define. Примерно так:
using Nemerle;
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;
using System;
namespace MacroLibrary1
{
macro gen(expr1 : PExpr)
syntax ("gen", expr1)
{
Macro3Impl.DoTransform(Macros.ImplicitCTX(), expr1)
}
module Macro3Impl
{
public DoTransform(typer : Typer, expr1 : PExpr) : PExpr
{
Macros.DefineCTX(typer);
match(expr1)
{
| <[ $per = $value ]> =>
def name=Macros.NewSymbol();
def gen_class = <[ decl: class $(name : name)
{
internal mutable valuetemp : int; // я добавил mutable чтобы можно было изменить это поле
public Method() : void
{
valuetemp = $value // здесь можно использовать сплайсы для доступа к внешним вещам
// сюда подставится выражение из value, и значению поля будет в конечном классе присвоено значение
}
}
]>; // получаем кусок цитаты класса
// в текущем классе вызвавшем макрос создаем подкласс процитированного нами класса
typer.CurrentTypeBuilder.DefineNestedType(gen_class).Compile();
<[ def $per = $value; ]> // результирующее выражение тоже надо писать отдельно от decl: квазицитаты
| _ => <[ ]>
}
}
}
}
вообще тело макроса писать лучше не в самом макросе а в хелпер методах, например теми которые генерируются с помощью визард диалогов создания макросов в студии, так вы получите полноценный интеллисенс и понятные сообщения об ошибках.
Здравствуйте, <Аноним>, Вы писали:
А> не понятна причина почему нельзя описывать все вместе....
А ты можешь в обычном коде написать все вместе? Нет. Не можешь.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>