Переменная в макросе
От: _nn_ www.nemerleweb.com
Дата: 07.12.10 13:11
Оценка:
Macro
namespace MacroLibrary1
{   
  public macro Test()
  {
      <[ $("_myProp" : usesite) ]>
  }
}


Main:
class MyTest
{
  public this()
  {
    _myProp = 1; // OK
    def t = Test(); // OK
    Test() = t; // Error: needed a writable location for assignment target, got a reference to field '_myProp', which is read-only
  }
  
  private _myProp : int;
}


Как получить переменную для записи ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Переменная в макросе
От: WolfHound  
Дата: 07.12.10 13:15
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Как получить переменную для записи ?

Может так:
__>
__>  private mutable _myProp : int;
__>


А это сработало ибо инициализация в конструкторе.
_myProp = 1; // OK
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Переменная в макросе
От: _nn_ www.nemerleweb.com
Дата: 07.12.10 13:18
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, _nn_, Вы писали:


__>>Как получить переменную для записи ?

WH>Может так:
__>>
__>>  private mutable _myProp : int;
__>>


WH>А это сработало ибо инициализация в конструкторе.

WH>
WH>_myProp = 1; // OK 
WH>


Ну так Test() и должен подставлять переменную которую я инициализирую в конструкторе.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Переменная в макросе
От: _nn_ www.nemerleweb.com
Дата: 07.12.10 17:16
Оценка: 92 (1)
Здравствуйте, _nn_, Вы писали:

здесь обламывается т.к. тип получается другим.

В первом случае имеем TExpr.FieldMember
А в случае макроса имеем тип Nemerle.Compiler.Typedtree.TExpr {Nemerle.Compiler.Typedtree.TExpr.MacroEnvelope}.

Как в макросе типизировать чтобы получился тип TExpr.FieldMember ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Переменная в макросе
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.12.10 18:36
Оценка:
Здравствуйте, _nn_, Вы писали:

__>здесь обламывается т.к. тип получается другим.


__>В первом случае имеем TExpr.FieldMember

__>А в случае макроса имеем тип Nemerle.Compiler.Typedtree.TExpr {Nemerle.Compiler.Typedtree.TExpr.MacroEnvelope}.

__>Как в макросе типизировать чтобы получился тип TExpr.FieldMember ?


Лучше в указанном тобой месте дополнительную проверку сделать (на MacroEnvelope). И распаковывать этот самый MacroEnvelope. Только еще нужно учесть, что есть еще одно место где проверяется л-вэлью — это отложенная типизация доступа к членам. Так что если проверку сделать только тут, то может оказаться, что в случае когда тип сразу не вывелся, код работать по прежнему не будет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Переменная в макросе
От: _nn_ www.nemerleweb.com
Дата: 08.12.10 09:16
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Лучше в указанном тобой месте дополнительную проверку сделать (на MacroEnvelope). И распаковывать этот самый MacroEnvelope. Только еще нужно учесть, что есть еще одно место где проверяется л-вэлью — это отложенная типизация доступа к членам. Так что если проверку сделать только тут, то может оказаться, что в случае когда тип сразу не вывелся, код работать по прежнему не будет.


А где именно в коде компилятора "еще одно место" ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Переменная в макросе
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.12.10 15:26
Оценка:
Здравствуйте, _nn_, Вы писали:

__>А где именно в коде компилятора "еще одно место" ?


Я не давно такой баг правил. Там не работал += для события, если событие тип объекта к чьему событию подключение идет не был известен сразу (шла отложенная типизация).

Вообще, конечно это бардак, что в компиляторе есть по два места где одно и то же проверяется. Во второй версии вывод типов нужно к чертям переписывать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Переменная в макросе
От: _nn_ www.nemerleweb.com
Дата: 09.12.10 09:54
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, _nn_, Вы писали:


__>>А где именно в коде компилятора "еще одно место" ?


VD>Я не давно такой баг правил. Там не работал += для события, если событие тип объекта к чьему событию подключение идет не был известен сразу (шла отложенная типизация).


VD>Вообще, конечно это бардак, что в компиляторе есть по два места где одно и то же проверяется. Во второй версии вывод типов нужно к чертям переписывать.


Решение понятно, но не совсем ясно что мне туда нужно вписать.
Я не думаю, что | _ is IMacro => true это правильное решение там .
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: Переменная в макросе
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.12.10 21:39
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Решение понятно, но не совсем ясно что мне туда нужно вписать.

__>Я не думаю, что | _ is IMacro => true это правильное решение там .

Это нужно думать по месту.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.