КЛ>Кароче, вот что у меня получилось после изучения lockMacro:
КЛ>
[skipped]
КЛ> def startType = ts.Type.Hint.Value.TypeInfo.SystemType;
КЛ> def endType = te.Type.Hint.Value.TypeInfo.SystemType;
КЛ> when( startType.Equals(typeof(int)) && endType.Equals(typeof(int)) )
[skipped]
КЛ> def func() { 10; };
КЛ> from 1 to func //internal compiler error: got some unknown exception of type System.NullReferenceException
КЛ> {
КЛ> WriteLine("Hi!");
КЛ> }
[skipped]
КЛ>
"ICE" вылезает потому что te.Type.Hint.Value.TypeInfo == null (знать не хочу почему )
В то время как te.Type.Hint.Value.SystemType содержит адекватное значение, а также кажется есть и повыше в иерархии такая информация.
Подумалось что в такие кишки залезать не стоит, а стоит лишь потребовать совпадения типов, во как
using Nemerle.Utility;
using Nemerle.Compiler;
namespace MacroLibrary1
{
public macro MyTestMacro(start, end, body)
syntax ("from", start, "to", end, body)
{
def typer = Nemerle.Macros.ImplicitCTX() : Nemerle.Compiler.Typer;
def ts = typer.TypeExpr(start);
def te = typer.TypeExpr(end);
when (!ts.Type.Unify (Nemerle.Macros.Manager ().InternalType.Int32))
Message.Error ("Need int for start");
when (!te.Type.Unify (Nemerle.Macros.Manager ().InternalType.Int32))
Message.Error ("Need int for end");
<[
when( $start >= $end )
throw System.ArgumentException();
for (mutable var = $start; var <= $end; var++) {
$body
}
]>;
}
}
Здравствуйте, Константин Л., Вы писали:
КЛ>а как их можно отлаживать, кроме как аттачиться к ncc в процессе компиляции macro assembly?
Компиляция сборки макроса как раз не при чем, разве что стоит с ключиком -g собирать макрос.
А дальше собственно надо аттачится к ncc в процессе компиляции основного приложения, иначе никак, макросы с компилятором взаимодействую очень тесно.
Ну и там как-то добавить в референсы сборку с макросом чтоли, в общем если все сложится, то можно и брейкпойнты в макросе ставить и в watch что-то будет видно
А вот как лучше всего подцеплятся к ncc не знаю, в форуме интеграции все еще не ответили, точно описать шаманства с которыми работаю не смогу
(сейчас есть симлинк папки с библиотеками компилера в другую, к параметрам ncc добавлен -nostdmacros -r symlink\Nemerle.Macros.dll, как-то так выглядит мой винегрет)
Здравствуйте, Константин Л., Вы писали:
КЛ>а как их можно отлаживать, кроме как аттачиться к ncc в процессе компиляции macro assembly?
1. Прописать в качестве отлаживаемого ехе-шника ncc.exe, задать ему в качестве параметров файл (*.n) использующий макрос и подключить сборку с макросом. Все это подробно описано в Макросы Nemerle – расширенный курс (Часть 1)
Здравствуйте, WolfHound, Вы писали:
WH>А конструкция WH>
WH> def gt1 = gt1;
WH> def gt2 = gt2;
WH>
WH>Для меня совсем загадка.
Это в отладочных целях. Такой прием позволяет видеть значения переменных в отладчике. Дело в том, что там появляется замыкание и переменные альфа-переименовываются, а такой прием позволяет создать локальные перменные с исходными именами. Джит в релизе из выкидывает.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>PExpr.TypedObject заполняется при типизации. Причем типизация процесс итеративный. Она может откладыватся и в PExpr.TypedObject значения не будет.
Я это дело немножко подкрутил, теперь по идее это поле должно быть заполнено даже после отложенной типизации. Но понятное дело на 100% уверенности нет.
Если нам не помогут, то мы тоже никого не пощадим.