Здравствуйте, Ziaw, Вы писали:
Z>Не будет. Это вообще странное пожелание, в Н2 не будет хардкода грамматик вообще. Весь парсер будет описан в виде синтаксических макросов.
Да, но макросы-то тоже код. В смысле, фундаментально они не решают проблему: какая разница, где захардкожен оператор, в макросе или в парсере?
Здравствуйте, catbert, Вы писали:
Z>>Не будет. Это вообще странное пожелание, в Н2 не будет хардкода грамматик вообще. Весь парсер будет описан в виде синтаксических макросов.
C>Да, но макросы-то тоже код. В смысле, фундаментально они не решают проблему: какая разница, где захардкожен оператор, в макросе или в парсере?
Это не оператор, это грамматика. Грамматика будет расширяема.
Хотелось бы возможность указывать , что переменная может быть инициализированна только в каком-то методе и один или более раза.
Часто имеем код:
class MyClass
{
MyType t;
public MyClass() {}
public void Start() { t = new MyType(); }
public void Stop() { t = null; }
}
t не может быть readonly, т.к. инициализация в Start.
А это означает , что если где-то меняем переменную, компилятор ничего не скажет.
Предложение:
class MyClass
{
// Установить значение можно только в MyMethodprivate readonly(MyMethod) var : MyType;
public void MyMethod()
{
var = new MyType(); // OK
var = null; // OK
}
public void MyMethod2()
{
var = null; // Error, только в MyMethod
}
}
Может быть возможно будет обойтись одним макросом ?
Здравствуйте, _nn_, Вы писали:
__>Хотелось бы возможность указывать , что переменная может быть инициализированна только в каком-то методе и один или более раза. __> // Установить значение можно только в MyMethod __> private readonly(MyMethod) var : MyType; __>Может быть возможно будет обойтись одним макросом ?
Можно. Но не уверен что нужно.
В прочем, если у тебя есть на это время, то можешь заняться.
Схема действий проста. Делаешь макро-атрибут для поля. Вешаешь другой макро-атрибут на весь класс с фазой WithTypedMembers. Во втором макросе обходишь все методы и с помощью Macros.TraverseExpr() обходишь все содержимое тел методов. Там фильтруешь присвоения и обращения по ссылке к нужной тебе переменной и выдаешь сообщение об ошибке.
Перед тем как делать обход имеет смысл типизировать тела методов, следующим образом:
После этого в meth.Body будет PExpr в свойстве TypedObject которых будет нужная тебе информация о типах. Ее можно использовать чтобы упростить идентификацию переменной.
Расплатой за это будет двойная типизация тел всех членов этого класса.
ЗЫ
По уму нужно был сделать макрос которые запускаются уже на типизированном АСТ. Об этом много раз уже говорили.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.