Re[3]: Вопрос по макросам
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.04.07 07:55
Оценка:
Здравствуйте, konsoletyper, Вы писали:

K>Поглядел 0.05. Ничего хорошего не увидел.


Очень плохо. Значит плохо разбирался.

K> Макрос, видимо, написан под устаревший компилятор.


Насколько я знаю, макрос этот вместе с тестом включен в недельные тесты. Можно пошукать по СВН-у.

K>Например, контруктору GlobalEnv передаётся один параметр (string), тогда как я обнаружил единственный публичный конструктор GlobalEnv с двумя параметрами (string, ManagerClass). Не совсем понятно, что должно быть в string. Так же не ясно, откуда брать ManagerClass. Создавать?


Экземляры GlobalEnv вообще нет смысла создавать сомостоятельно. Они хранят контекст (список открытых пространств имен, ключевых слов и операторов). Ссылки на них есть в любом имени и во многих других конструкциях.

ManagerClass или простро Manager — это "главный центр управления", что ли. В интеграции он переопределяется на Engine. Manager доступен почти везде. Просто поищи "Manager" по коду компилятора или "Engine" по коду интеграции.

K>Вообще, очень интересует, как из макроса создать класс.


Это же на первой странице посвященной макросам описано:
http://nemerle.org/Defining_types_from_inside_macros

Только, как я уже говорил, нужно использовать доп. проверки совйств InErrorMode и IsIntelliSenseMode.

K> Судя по примеру Oyster'а, это делается через GlobalEnv. Но не является ли это хаком?


Нет. Но можно и через тайпбилдер.

K> Как на это среагирует Интеграция? И если всё нормально, то каким образом можно корректно получить GlovalEnv из макро-атрибута уровня сборки?


С интеграцией есть только одна особенность. Она парсит код методов по требованию. То есть если ты попыташся добавить класс внутри метода, то:
1. Это не произойдет до тех пор пока программист не откроет файл содержащий этот метод.
2. Этот код будет вызваться неопределенное количество раз, так как любое изменение, интелисенс и т.п. могут привести к повторному парсингу тел методов.

K>Кстати, сейчас пытаюсь сделать так. Делаю два макроса: макро-атрибут BNF, и макрос lexer. Во-первых, будет ли макрос lexer разворачиваться внутри атрибута?


Э... не совсем понял вопрос.

K> Во-вторых, сейчас lexer просто разворачивается в списко кортежей, каждый из которых просто описывает лексему bnf. Планируется, что макрос BNF будет разбирать этот список, преобразовывать в поток лексем и т.д. Но, ИМХО, это криво. Неужели нет возможности всё это проделать непосредственно?


Тоже не понял.

Попытайся описать то что ты хочешь более детально.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.