load_block = \
<[
_ = 1; //без этого не работает - глюкwhen ($exchange != 0)
$refer = $fld_type.load(datamap, $exchange);
]>
без "_ = 1" получаю ошибку
Ошибка 99 expected Nemerle.Compiler.Parsetree.PExpr.Sequence, got Nemerle.Compiler.Parsetree.PExpr.MacroCall in assigned value: Nemerle.Compiler.Parsetree.PExpr.MacroCall is not a subtype of Nemerle.Compiler.Parsetree.PExpr.Sequence [simple require]
_C_>load_block = \
_C_> <[
_C_> _ = 1; //без этого не работает - глюк
_C_> when ($exchange != 0)
_C_> $refer = $fld_type.load(datamap, $exchange);
_C_> ]>
_C_>
_C_>без "_ = 1" получаю ошибку
_C_>Ошибка 99 expected Nemerle.Compiler.Parsetree.PExpr.Sequence, got Nemerle.Compiler.Parsetree.PExpr.MacroCall in assigned value: Nemerle.Compiler.Parsetree.PExpr.MacroCall is not a subtype of Nemerle.Compiler.Parsetree.PExpr.Sequence [simple require]
А можешь привести еще код, который использует этот код? Попробуй также весь код в квазицитате поместить в {}, то есть:
Здравствуйте, _Claus_, Вы писали:
_C_>с ним — все ок. известная ошибка?
Это не ошибка when — действительно макрос и понять что это не вызов макроса, а блок кода компилятор не в силах. Чтобы явно сказать, что нужен блок выражение в цитате нужно заключить в фигурные скобки.
Здравствуйте, _Claus_, Вы писали:
_C_> load_block определена в классе как "mutable load_block = <[]>"
Я так понимаю это мутабл поле, ну так ты ему присвоил значение выражения PExpr.Sequence, то есть последовательность выражений, так трактуется эта запись, поэтому присвоение другого типа цитаты, например PExpr.Macrocall который ты процитировал невозможно, можно полю дать тип PExpr, тогда должен принять, или подавать в это поле только последовательности, то есть код заключенный в {}.
CU>Я так понимаю это мутабл поле, ну так ты ему присвоил значение выражения PExpr.Sequence, то есть последовательность выражений, так трактуется эта запись, поэтому присвоение другого типа цитаты, например PExpr.Macrocall который ты процитировал невозможно, можно полю дать тип PExpr, тогда должен принять, или подавать в это поле только последовательности, то есть код заключенный в {}.
если пишу
mutable x = <[]>
x = <[..]> то по идее должно работать, что бы там ни было в ..
<[]> ожидается тип что-угодно и несовместимость с развернутой цитатой воспринял как ошибку.
Здравствуйте, _Claus_, Вы писали:
_C_>если пишу _C_>mutable x = <[]> _C_>x = <[..]> то по идее должно работать, что бы там ни было в .. _C_><[]> ожидается тип что-угодно и несовместимость с развернутой цитатой воспринял как ошибку.
Поидее должно, но на практике, вывод типов для полей происходит намного раньше и фиксируется начальным значением, здесь лучше указать PExpr, иначе он его выведет сам из типа цитаты, как конкретный тип PExpr.Sequence и после не даст что то иное присвоить.
Еще вот проблема не дает спокойно кодить: формирую сложную квазицитату в одном контексте,
а потом кроме него вставляю в другом . контексты отличаются тем, что в одном некая переменная — член класса,
в другом — локальная переменная (логической ошибки нет — варианты специфичны). фрагмент генерации:
код выглядит валидно и по сути таковым и является,
однако ошибки "unbound name _exchange" или
unbound name `_exchange.s = s'
error : unbound name `datamap.write_string(r, ref _exchange.r)'
если вставляю выражения как строки.
как можно не дублировать кодогенератор для чуть измененного окружения?
есть ли разумный способ заставить компилятор видеть вставку как строку а не как ошибочный AST?
Здравствуйте, _Claus_, Вы писали:
_C_>получаю нужный кусок, и пытаюсь его задействовать в чуть другом контексте, но получаю ошибки.
До конца непонятно, по идее если контекст не отличается коренным образом, то есть если использовать $(expr : usesite), то будет привязка к переменной или к члену текущего класса, использование dyn или global дает худшие варианты.
_C_>если вставляю выражения как строки.
выражения не вставляются как строки, выражения вставляются как выражения, единственно важно в каком контексте привязываются переменные и usesite, dyn, туда они подаются строками, лучше использовать usesite.
_C_>как можно не дублировать кодогенератор для чуть измененного окружения?
по идее должно работать и для измененного окружения
_C_>есть ли разумный способ заставить компилятор видеть вставку как строку а не как ошибочный AST?
смотря где производится вставка. До конца не понятно о чем идет речь, если ты приведешь более подробный код, то можно будет более точно проанализировать ошибку.
CU>До конца непонятно, по идее если контекст не отличается коренным образом, то есть если использовать $(expr : usesite), то будет привязка к переменной или к члену текущего класса, использование dyn или global дает худшие варианты.
В общем помогло, спасибо, остался только один момент, с этим связанный.
для составных имен я использовал PExpr.FromQualifiedIdentifier, теперь, переписав на что-то типа
exchange = <[_exchange.$($"$fld_name" : usesite) ]> баги в контексте локальной переменной ушли, но появился один странный
error : a ref or out argument must be an assignable variable — ошибка при компиляции сгенеренного кода.
т. к. в типе для _exchange у меня все public, это неадекват. Выясняя причину, обнаружил что код ниже
с добавленной строкой, которая должна была показать что-нить, ничего не показала, а ошибка ушла.
Здравствуйте, _Claus_, Вы писали:
_C_>В общем помогло, спасибо, остался только один момент, с этим связанный.
_C_>для составных имен я использовал PExpr.FromQualifiedIdentifier, теперь, переписав на что-то типа
_C_>что это могло бы быть?
вообще сплайсы внутри сплайсов помоему не очень хорошо использовать. Приведи более полный пример, генерируется неправильный код, по указанному сложно понять.
CU>вообще сплайсы внутри сплайсов помоему не очень хорошо использовать. Приведи более полный пример, генерируется неправильный код, по указанному сложно понять.
Я пытался выделить простой пример, воспроизводящий ошибку, но не смог. она как то сильно связана с контекстом и уходит /появляется , кроме упомянутого выражения, в зависимости от несвязанного кода в соседних методах, поэтому конечно стоило бы разобраться. я близок к инитиальному релизу своей базы данных. если интерес сохранится, я там помечу это место.
Здравствуйте, _Claus_, Вы писали:
_C_>Я пытался выделить простой пример, воспроизводящий ошибку, но не смог. она как то сильно связана с контекстом и уходит /появляется , кроме упомянутого выражения, в зависимости от несвязанного кода в соседних методах, поэтому конечно стоило бы разобраться. я близок к инитиальному релизу своей базы данных. если интерес сохранится, я там помечу это место.
Ты можешь выложить свой проект на гитхабе или где то и пометить места которые нуждаются в разьяснении я могу посмотреть.