Re[3]: Nemerle 2.0
От: Ziaw Россия  
Дата: 30.06.11 04:06
Оценка:
Здравствуйте, catbert, Вы писали:

__>>(Невозможно создать макрос начинающийся с '$' )


C>А это не будет конфликтовать с квазицитированием?


Не будет. Это вообще странное пожелание, в Н2 не будет хардкода грамматик вообще. Весь парсер будет описан в виде синтаксических макросов.
Re[4]: Nemerle 2.0
От: catbert  
Дата: 30.06.11 13:39
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Не будет. Это вообще странное пожелание, в Н2 не будет хардкода грамматик вообще. Весь парсер будет описан в виде синтаксических макросов.


Да, но макросы-то тоже код. В смысле, фундаментально они не решают проблему: какая разница, где захардкожен оператор, в макросе или в парсере?
http://nemerle.org/banners/?t=%20catbert%20
Re[5]: Nemerle 2.0
От: Ziaw Россия  
Дата: 01.07.11 03:19
Оценка:
Здравствуйте, catbert, Вы писали:

Z>>Не будет. Это вообще странное пожелание, в Н2 не будет хардкода грамматик вообще. Весь парсер будет описан в виде синтаксических макросов.


C>Да, но макросы-то тоже код. В смысле, фундаментально они не решают проблему: какая разница, где захардкожен оператор, в макросе или в парсере?


Это не оператор, это грамматика. Грамматика будет расширяема.
Re: Nemerle 2.0
От: _nn_ www.nemerleweb.com
Дата: 10.08.11 16:24
Оценка:
Хотелось бы возможность указывать , что переменная может быть инициализированна только в каком-то методе и один или более раза.

Часто имеем код:
class MyClass
{
  MyType t;

  public MyClass() {}
  
  public void Start() { t = new MyType(); }
  public void Stop() { t = null; }
}


t не может быть readonly, т.к. инициализация в Start.
А это означает , что если где-то меняем переменную, компилятор ничего не скажет.

Предложение:

class MyClass
{
   // Установить значение можно только в MyMethod
   private readonly(MyMethod) var : MyType;

   public void MyMethod()
   {
      var = new MyType(); // OK
      var = null; // OK
   }

   public void MyMethod2()
   {
      var = null; // Error, только в MyMethod
   }
}


Может быть возможно будет обойтись одним макросом ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Nemerle 2.0
От: Ziaw Россия  
Дата: 10.08.11 17:15
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Может быть возможно будет обойтись одним макросом ?


Предполагаю, что можно уже сейчас сделать нормальную стейт-машину используя Nemerle.Statechart.
Re[2]: Nemerle 2.0
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.08.11 19:30
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Хотелось бы возможность указывать , что переменная может быть инициализированна только в каком-то методе и один или более раза.

__> // Установить значение можно только в MyMethod
__> private readonly(MyMethod) var : MyType;
__>Может быть возможно будет обойтись одним макросом ?

Можно. Но не уверен что нужно.
В прочем, если у тебя есть на это время, то можешь заняться.

Схема действий проста. Делаешь макро-атрибут для поля. Вешаешь другой макро-атрибут на весь класс с фазой WithTypedMembers. Во втором макросе обходишь все методы и с помощью Macros.TraverseExpr() обходишь все содержимое тел методов. Там фильтруешь присвоения и обращения по ссылке к нужной тебе переменной и выдаешь сообщение об ошибке.

Перед тем как делать обход имеет смысл типизировать тела методов, следующим образом:
        def oldEmitDebug = typer.Manager.Options.EmitDebug;
        typer.Manager.Options.EmitDebug = false;
        def methodTyper = Typer(tb, null, meth, meth.Env);
        methodTyper.RunFullTyping();
        typer.Manager.Options.EmitDebug = oldEmitDebug;

После этого в meth.Body будет PExpr в свойстве TypedObject которых будет нужная тебе информация о типах. Ее можно использовать чтобы упростить идентификацию переменной.

Расплатой за это будет двойная типизация тел всех членов этого класса.

ЗЫ

По уму нужно был сделать макрос которые запускаются уже на типизированном АСТ. Об этом много раз уже говорили.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.