проблема с квазицитированием
От: _Claus_  
Дата: 20.01.12 08:08
Оценка:
у меня в коде есть такие блоки

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]


с ним — все ок. известная ошибка?
Re: проблема с квазицитированием
От: CodingUnit Россия  
Дата: 20.01.12 08:15
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>
_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]


А можешь привести еще код, который использует этот код? Попробуй также весь код в квазицитате поместить в {}, то есть:


<[
 {
 _ = 1;
 ...
 }
]>


ошибки остаются?
Re: проблема с квазицитированием
От: _Claus_  
Дата: 20.01.12 08:16
Оценка:
_C_>с ним — все ок. известная ошибка?

load_block определена в классе как "mutable load_block = <[]>"
Re: проблема с квазицитированием
От: hardcase Пират http://nemerle.org
Дата: 20.01.12 08:19
Оценка: +1
Здравствуйте, _Claus_, Вы писали:

_C_>с ним — все ок. известная ошибка?


Это не ошибка when — действительно макрос и понять что это не вызов макроса, а блок кода компилятор не в силах. Чтобы явно сказать, что нужен блок выражение в цитате нужно заключить в фигурные скобки.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: проблема с квазицитированием
От: hardcase Пират http://nemerle.org
Дата: 20.01.12 08:20
Оценка: +1
Здравствуйте, hardcase, Вы писали:

H>Чтобы явно сказать, что нужен блок выражение в цитате нужно заключить в фигурные скобки.


Либо переписать код обработчика load_block таким образом, чтобы он принимал не только Sequence, но вообще любой PExpr.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: проблема с квазицитированием
От: CodingUnit Россия  
Дата: 20.01.12 08:24
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_> load_block определена в классе как "mutable load_block = <[]>"


Я так понимаю это мутабл поле, ну так ты ему присвоил значение выражения PExpr.Sequence, то есть последовательность выражений, так трактуется эта запись, поэтому присвоение другого типа цитаты, например PExpr.Macrocall который ты процитировал невозможно, можно полю дать тип PExpr, тогда должен принять, или подавать в это поле только последовательности, то есть код заключенный в {}.
Re[3]: проблема с квазицитированием
От: _Claus_  
Дата: 20.01.12 08:30
Оценка:
CU>Я так понимаю это мутабл поле, ну так ты ему присвоил значение выражения PExpr.Sequence, то есть последовательность выражений, так трактуется эта запись, поэтому присвоение другого типа цитаты, например PExpr.Macrocall который ты процитировал невозможно, можно полю дать тип PExpr, тогда должен принять, или подавать в это поле только последовательности, то есть код заключенный в {}.


если пишу
mutable x = <[]>
x = <[..]> то по идее должно работать, что бы там ни было в ..

<[]> ожидается тип что-угодно и несовместимость с развернутой цитатой воспринял как ошибку.

спасибо, буду знать.
Re[4]: проблема с квазицитированием
От: CodingUnit Россия  
Дата: 20.01.12 19:55
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>если пишу

_C_>mutable x = <[]>
_C_>x = <[..]> то по идее должно работать, что бы там ни было в ..
_C_><[]> ожидается тип что-угодно и несовместимость с развернутой цитатой воспринял как ошибку.

Поидее должно, но на практике, вывод типов для полей происходит намного раньше и фиксируется начальным значением, здесь лучше указать PExpr, иначе он его выведет сам из типа цитаты, как конкретный тип PExpr.Sequence и после не даст что то иное присвоить.
Re[2]: другая проблема с квазицитированием
От: _Claus_  
Дата: 21.01.12 00:25
Оценка:
Еще вот проблема не дает спокойно кодить: формирую сложную квазицитату в одном контексте,
а потом кроме него вставляю в другом . контексты отличаются тем, что в одном некая переменная — член класса,
в другом — локальная переменная (логической ошибки нет — варианты специфичны). фрагмент генерации:


        save_block = <[  datamap.write_string($refer,ref $exchange); ]>

        when (load_control)
                                
          save_block = <[$loaded = true; $save_block]>
          
        when (save_control)
          
          save_block = <[
            when($var_has2save)
            { 
              $var_has2save = false;
              $save_block
            }]> 

         ..



получаю нужный кусок, и пытаюсь его задействовать в чуть другом контексте, но получаю ошибки.


public override Save() : void 
{
  mutable _exchange;
  
  {
    mutable s;
    _exchange.s = s; //ошибка 1 - цитата вставлена
    
    {
      mutable r;
      datamap.write_string(r, ref _exchange.r); //о 2 - цитата вставлена       
    }
  };
  datamap.write.[exchange_A](_exchange, ref address, type_id()) 
}


код выглядит валидно и по сути таковым и является,
однако ошибки "unbound name _exchange" или
unbound name `_exchange.s = s'
error : unbound name `datamap.write_string(r, ref _exchange.r)'

если вставляю выражения как строки.

как можно не дублировать кодогенератор для чуть измененного окружения?

есть ли разумный способ заставить компилятор видеть вставку как строку а не как ошибочный AST?
Re[3]: другая проблема с квазицитированием
От: CodingUnit Россия  
Дата: 21.01.12 10:38
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>получаю нужный кусок, и пытаюсь его задействовать в чуть другом контексте, но получаю ошибки.


До конца непонятно, по идее если контекст не отличается коренным образом, то есть если использовать $(expr : usesite), то будет привязка к переменной или к члену текущего класса, использование dyn или global дает худшие варианты.

_C_>если вставляю выражения как строки.


выражения не вставляются как строки, выражения вставляются как выражения, единственно важно в каком контексте привязываются переменные и usesite, dyn, туда они подаются строками, лучше использовать usesite.

_C_>как можно не дублировать кодогенератор для чуть измененного окружения?


по идее должно работать и для измененного окружения

_C_>есть ли разумный способ заставить компилятор видеть вставку как строку а не как ошибочный AST?


смотря где производится вставка. До конца не понятно о чем идет речь, если ты приведешь более подробный код, то можно будет более точно проанализировать ошибку.
Re[4]: другая проблема с квазицитированием
От: _Claus_  
Дата: 23.01.12 18:47
Оценка:
CU>До конца непонятно, по идее если контекст не отличается коренным образом, то есть если использовать $(expr : usesite), то будет привязка к переменной или к члену текущего класса, использование dyn или global дает худшие варианты.

В общем помогло, спасибо, остался только один момент, с этим связанный.

для составных имен я использовал PExpr.FromQualifiedIdentifier, теперь, переписав на что-то типа

exchange = <[_exchange.$($"$fld_name" : usesite) ]> баги в контексте локальной переменной ушли, но появился один странный

public override Save() : void 
{
  mutable _exchange;
  
  {
    _exchange.s = s;
    datamap.write_string(r, ref _exchange.r)
  };
  ...
}

error : a ref or out argument must be an assignable variable — ошибка при компиляции сгенеренного кода.

т. к. в типе для _exchange у меня все public, это неадекват. Выясняя причину, обнаружил что код ниже
с добавленной строкой, которая должна была показать что-нить, ничего не показала, а ошибка ушла.

public override Save() : void 
{
  mutable _exchange;
  
  {
    
    {
      _exchange.s = _exchange.s;
      _exchange.s = s
    };
    
    {
      _exchange.r = _exchange.r;         //добавлено при генерации!!! 
      datamap.write_string(r, ref _exchange.r)
    }
  };
  ...
}


что это могло бы быть?
Re[5]: другая проблема с квазицитированием
От: CodingUnit Россия  
Дата: 24.01.12 17:02
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>В общем помогло, спасибо, остался только один момент, с этим связанный.


_C_>для составных имен я использовал PExpr.FromQualifiedIdentifier, теперь, переписав на что-то типа


_C_>что это могло бы быть?


вообще сплайсы внутри сплайсов помоему не очень хорошо использовать. Приведи более полный пример, генерируется неправильный код, по указанному сложно понять.
Re[6]: другая проблема с квазицитированием
От: _Claus_  
Дата: 24.01.12 23:14
Оценка:
CU>вообще сплайсы внутри сплайсов помоему не очень хорошо использовать. Приведи более полный пример, генерируется неправильный код, по указанному сложно понять.

Я пытался выделить простой пример, воспроизводящий ошибку, но не смог. она как то сильно связана с контекстом и уходит /появляется , кроме упомянутого выражения, в зависимости от несвязанного кода в соседних методах, поэтому конечно стоило бы разобраться. я близок к инитиальному релизу своей базы данных. если интерес сохранится, я там помечу это место.
Re[7]: другая проблема с квазицитированием
От: CodingUnit Россия  
Дата: 25.01.12 13:07
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>Я пытался выделить простой пример, воспроизводящий ошибку, но не смог. она как то сильно связана с контекстом и уходит /появляется , кроме упомянутого выражения, в зависимости от несвязанного кода в соседних методах, поэтому конечно стоило бы разобраться. я близок к инитиальному релизу своей базы данных. если интерес сохранится, я там помечу это место.


Ты можешь выложить свой проект на гитхабе или где то и пометить места которые нуждаются в разьяснении я могу посмотреть.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.