имеется в виду тела методов? или у полей тоже могут быть тела? или же имеются в виду тела геттеров и сеттеров тоже? но тогда получается, что геттеры и сеттеры являются членами, и поэтому должны относиться к методам?
Здравствуйте, gandjustas, Вы писали:
G>Не интересует не просто примеры кода, а именно примеры приложений. Даже если не очень настоящих, но тем не менее готовых и работающих. Именно приложений, а не библиотек.
Есть готовые работающие приложения, в своей организации я применял Немерле для написания OPC-сервера для сбора данных с внешних устройств подключенных к портам и организации обмена с OPC-клиентами, scada-системами. Также обычные пользовательские приложения Windows Forms, очень удобно на нем пишутся, писал что то типа монитора сбора данных и программы для калибровки. Собираюсь еще в некоторых проектах его использовать, все программы где применим C# очень легко пишутся. Я думаю многие где возможно применяют его в практике.
Здравствуйте, m e, Вы писали:
VD>>Так что единственный вариант разобраться — это использовать его для реальных задач.
ME>меня не устраивает этот якобы единственный вариант
Тогда завязывай с программированием. В нашем деле чтобы что-то освоить нужно обязательно начать использовать это что-то на практике. Книги, статьи, блоги и т.п. — это не более чем средство получения минимально-необходимых знаний. Но понять ЯП в теории невозможно. Практика необходима.
ME>мне нужно прочесть *описание* языка (я не говорю стандарт, хотя бы описание)
посвященную синтаксису.
ME>это значит, что хотя бы должна быть определена терминология -- т.е. все фазы компиляции должны быть названы словами русского или английского языка (а не названиями процедур, функций, энумов или х.з. чего из исходного кода), и называться везде одинаково -- скажем, фаза WithTypedMembers части 5-й соответствует какой из фаз 1-9 из http://www.rsdn.ru/article/nemerle/MacrosExtCoursePart4.xml
? (при этом функции и т.д. *можно* называть по названиям фаз, но не наоборот)
Все везде называется одинаково. Как я понимаю, то что ты называешь 1-9 — это просто перечисление этапов компиляции. Они к фазам макроса прямого отношения не имеют. Так что не надо искать тут соотвествие.
Хотя, еще раз повторяю, что читать "Макросы Nemerle – расширенный курс" можно только после глубокого и серьезного практического использования макросов в течении, хотя бы, месяца. Это курс для тех кто уже в теме и хочет углубить свои знания, а не как для начинающих.
ME>то, что в http://www.rsdn.ru/article/nemerle/MacrosExtCoursePart4.xml
написано "6. Типизирует члены типов", заставляет вылезти из парсера, посмотреть, не сломался ли он, и продолжать движение вперед на скорости 5-10 км/ч
Вообще ничего не понял. Откуда вылезти? Куда двигаться? О чем речь то?
ME>да, даже если "класс" и "тип" у вас одно и то же, то это как минимум непривычно; более того, я подозреваю, что у вас есть неклассовые типы, и должно было быть написано "6. Типизирует члены классов"
Я же не виноват, что тебе не привычно, что кроме классов есть еще и другие типы? Привыкай. В дотнете есть структуры и перечисления. В Немерле в добавок есть вариантные типы. Все это не классы, но пользовательские типы.
ME>из описания языка должны быть выброшены куски исходного кода компилятора
А кто тебе сказал что "Макросы Nemerle – расширенный курс" — это описание языка? Я устал повторять, что это продвинутый материал. Его просто не надо читать в начале пути. У Вользфхаунад есть дна проблема. Он все судит по себе. В том числе и доступность материалов. Но то, в отличии от тебя, уже несколько лет сам пишет макросы. И ему расширенный курс в самый раз.
ME>(хотя их конечно можно вынести на отдельные странички, на которые ведут ссылки из описания), и могут быть добавлены примеры на каждую фазу трансляции -- как выглядит полученное к тому времени AST
Просто читай то что тебе предлагают и не перепрыгивай через стадии обучения. Тогда все будет ОК.
ME>в целом, я думаю можно взять как раз последние части разных курсов, привести в порядок терминологию, может быть потребуется чуть пораскидать их куски по разделам и получится вполне пригодная к прочтению вещь
Еще раз, с терминологией все в порядке. Если что-то не так, то приводи конкретные абзацы и объясняй, что там не так. Будем думать надо ли там что-то править. Пока что я проблем не видел. Терминологию подбирали вдумчиво.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, gandjustas, Вы писали:
G>Не интересует не просто примеры кода, а именно примеры приложений. Даже если не очень настоящих, но тем не менее готовых и работающих. Именно приложений, а не библиотек.
Тебе предупреждение за офтопик не пришло? Или ты решил, что такую вещь как предупреждение модератонов можно игнорировать?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
ME>>меня не устраивает этот якобы единственный вариант
VD>Тогда завязывай с программированием.
спасибо, о Великий Гуру, за Бесценный Совет
но я продолжу самостоятельно выбирать, что мне изучать теоретически, а что использовать на практике
если интересно почему так -- я не использую на практике то, что не понимаю в достаточной степени
степень достаточности понимания я определяю самостоятельно
ME>>мне нужно прочесть *описание* языка (я не говорю стандарт, хотя бы описание)
VD>Читай Язык Немерле. Я только что вложил шестую часть
да, это обязательно прочту -- хотя тут скорее не синтаксис, а семантика
ME>> ... фаза WithTypedMembers части 5-й ...
VD>Все везде называется одинаково. Как я понимаю, то что ты называешь 1-9 — это просто перечисление этапов компиляции. Они к фазам макроса прямого отношения не имеют.
упс?!
в 5-й части написано:
> Использование фазы компиляции WithTypedMembers > Выпадающий список «Macro Phase» позволяет задать стадию компиляции, на которой будет вызываться макро-атрибут.
замечу, *стадию компиляции*
(объяснение опять же из этой части приводит к предположению, что WithTypedMembers >= 7)
VD>Так что не надо искать тут соотвествие.
почему не надо? и там и там разговор идет о некой последовательности фаз/стадий/шагов/... компиляции с весьма *похожими* характеристиками
что я путаю?
VD>Еще раз, с терминологией все в порядке. Если что-то не так, то приводи конкретные абзацы и объясняй, что там не так.
но после беглого взгляда на "члены типа" уже возникает вопрос -- там указано, какие из типов могут иметь члены, а какие нет? скажем, может ли функциональный тип иметь члены (кажется что нет, но кто вас знает)? а тип массива? (тут уже не поставлю ни на что) а если может, то происходит ли там "7. Типизирует тела членов."?
VD>А кто тебе сказал что "Макросы Nemerle – расширенный курс" — это описание языка?
я не утвеждал, что это описание
где лежит именно описание языка -- не только синтаксиса и немного семантики (ты уже дал ссылку), а семантики в части макросов? (да, там будет скорее всего операционная семантика, но это вполне меня устраивает)
VD> В нашем деле чтобы что-то освоить нужно обязательно начать использовать это что-то на практике.
я считаю, что на практике в прогах от 1000 строк можно использовать только тот язык программирования, у которого есть описание языка, а не рассказ "что делает вот этот код в нашем компиляторе" (или интерпретаторе, если речь не про немерле)
понятно, что это вовсе не обзательно должно быть формальное описание, и даже не обязательно стандарт, но описание быть должно
т.е. да, можно пописать кусочки кода в 30 строк, но на столь малых прогах все по-другому -- скажем, уже нет профита юзать статическую типизацию, и даже возможно наоборот, есть смысл использовать языки без нее и без деклараций переменных -- так что немерле тут оценить вряд ли удастся
>> 7. Типизирует тела членов.
ME>имеется в виду тела методов? или у полей тоже могут быть тела?
У полей есть инициализирующие выражения. Они в итоге переписываются в конструкторы, но логически это выражения связанные
ME>или же имеются в виду тела геттеров и сеттеров тоже?
Свойства тоже члены. Так что когда говорится о телах членов, то имеется в виду и гетеры с сетеры в том числе.
ME>но тогда получается, что геттеры и сеттеры являются членами, и поэтому должны относиться к методам?
Физически код вне методов и конструкторов быть не может. Но логически есть свойства и инициализаторы полей. Так что в общем, говорить приходится о выражениях в членах.
ME>короче -- еще раз -- реквестирую терминологию
Она есть. Просто ты не привык. Разжевать все нереально. Так что просто спрашивай, а мы будем отвечать. Потом в ФАК добавим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, m e, Вы писали:
ME>в связи с постом gandjustas -- меня абсолютно не интересует, что на немерле написано
Этот товарищ просто достал. Он с периодичностью будильника этот вопрос к месту и не к месту задает. Причем когда ему выдают список, то он начинает с ним бороться. В общем, у него одна задача — обосновать для себя то почему ему ни в коем случае с этим не надо разбираться.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
вот, в результате дешифровки и допроса источников с особым пристрастием, у меня получилось вот это
в скобках подчеркнутым выделены мои вопросы и замечания
какие тут ошибки?
для начала назовем агрегатами (aggregates) все, что может иметь члены (полный список должен быть в описании языка); агрегаты могут поддерживать наследование (или всегда поддерживают наследование?)
Фаза импорта. Считывается описание типов, импортируемых из внешних сборок.
Фаза пре-парсинга. Производится пре-парсинг файлов, получая при этом дерево токенов, свернутых по скобкам (че такое скобки? я догадываюсь, но не ясно зачем это надо -- у вас ассоциативность оператора может зависеть от типов, или зачем?). На этом этапе формируется так называемое «окружение»(где жаргонный термин?). В окружении сохраняется информация об открытых пространствах имен, а значит, доступных макросах и операторах.
Фаза парсинга. Производит парсинг. Он состоит из создания AST верхнего уровня (TopDeclaration) (нет четкого примера в описании синтаксиса; приведу свой оттуда: public class MyList[T] : IList[T] {....} ) и создания нетипизированного AST тел членов (PExpr).
Фаза перед наследованием. Запуск макросов BeforeInheritance.
Фаза наследования. Строится дерево наследования агрегатов. Дерево строится на основании информации об импортированных из других сборок агрегатов и на основании TopDeclaration разобранных исходных файлов.
(выброшеная фаза: Производит разрешение наследования (задает отношения между типами), т.к. она излишняя)
Фаза перед типизацией членов. Запуск макросов BeforeTypedMembers.
Фаза типизации членов. Типизируются члены агрегатов, т.е. связываются текстовые (че??? у нас же вроде AST везде?) описания типов параметров и возвращаемых значений с типами из дерева агрегатов. Компилятор не допускает вывода типов для членов агрегатов, поэтому после этого этапа становятся известными типы всех членов. Для методов это означает, что становятся известны типы аргументов и типы возвращаемых значений.
Фаза типизации тел методов. (К методам относятся и конструкторы). Инициализаторы полей, а также getter-ы/setter-ы свойств преобразуются в методы (так, инициализаторы полей реально копируются в конструкторы агрегатов). Затем типизируются тела методов в агрегатах -- раскрываются макросы WithTypedMembers и производится вывод типов. Это самая сложная фаза компиляции. На выходе этой фазы тела методов содержат типизированный AST (TExpr). Состоит из следующих подфаз:
Фаза раскрытия последних макросов. Раскрытие макросов в порядке их следования в нетипизированном AST (PExpr), что соответствует порядку их следованияв тексте программы. На выходе получается также нетипизированное AST, но уже не содержащее обращений к макросам.
Фаза создания уравнений типизации. Вычисляются те соотношения, которые связывают типы. Эти соотношения мы назовем уравнениями типизации
Фаза решения уравнений типизации. Уравнения решаются, и AST становится полностью типизированным.
Фаза оптимизации. Производятся различные преобразования над типизированым AST, оптимизация и т.п. (что и т.п.?)
Здравствуйте, m e, Вы писали:
ME>я слегка пошлифовал твой текст, но даже и в моей редакции он порядком ухабист, надо шлифовать его дальше, перед тем, как показывать нормальным людям
По шлифовал что и где?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
в первую очередь, давай выясним не ошибся ли я и правильно ли все понял
в частности, удаленная мной фаза (см. в тексте) действительно является пересказом соседней, или я не разобрался?
вообще предполагается, ты что мой текст прочтешь и укажешь ошибки или ложные мнения, которые в результате его чтения могут возникнуть
если интересно почему я считаю, что это шлифовка, то тоже могу написать, но объем будет примерно как у самого текста
вкратце: фазы компиляции *нельзя* именовать цифрами, да еще написанными не от руки, а полученными через нумерованный список (и если у фаз есть общепринятые названия, отличные от моих, то их надо указать)
Здравствуйте, m e, Вы писали:
ME>вот, в результате дешифровки и допроса источников с особым пристрастием, у меня получилось вот это ME>в скобках подчеркнутым выделены мои вопросы и замечания ME>какие тут ошибки?
Главных ошибок две
1. Ты вместо того, чтобы прочитать текст дальше взялся за скрупулезный разбор поверхностного введения. За одно почему-то посчитал, что фазы используемые макросах должны иметь четкое отображение на этапы компиляции. Зависимость несоменнно есть, но фазы макросов идут как бы между этапами компиляции.
2. Ты взялся за чтение текста предназначенного для тех кто уже разбирается в макросах и языке и хочет углубить свои знания. Читать "расширенный курс" не зная языка и не имея опыта создания макросов — это не верный шаг. Так ты только запутаешься.
ME>для начала назовем агрегатами (aggregates) все, что может иметь члены (полный список должен быть в описании языка); агрегаты могут поддерживать наследование (или всегда поддерживают наследование?)
Не. Так мы делать не будем. Это какая-то самодеятельность. Вся терминалогия и описания того как классифицируются типы в Немерле описана в 6-й части Языка Немерле
Наследование поддерживается только в классах, интерфейсах и от части в структурах и перечислениях. При этом есть масса нюансов. Полностью наследование доступно только для классов и интерфейсов.
Процитированное ниже большая часть изменений сделана не верно. Так что рассматривать его особого смысла нет. Ну, раз уж пошла такая пьянка, то прокомментирую его.
Первое что хочется заметить — оригинальный список является поверх и от того не вполне корректным. В нем намеренно были сделаны не некоторые вольные допущения. Если уж хочется разобраться глубже, то придется их устранить.
Второе замечание — использования термина "фаза" здесь не уместно, так как оно входит в конфликт с термином используемым для обозначения фазы работы макросов (которая так же иногда называется фазой компиляции). Наверно имеет смыл по моим текстам поправить "фазы компиляции" на "фазы работы макросов".
ME>Фаза импорта. Считывается описание типов, импортируемых из внешних сборок.
ME>Фаза пре-парсинга. Производится пре-парсинг файлов, получая при этом дерево токенов, свернутых по скобкам (че такое скобки? я догадываюсь, но не ясно зачем это надо -- у вас ассоциативность оператора может зависеть от типов, или зачем?).
Это детали не относящиеся к делу. Если вкратце, сворачивание по скобкам обходит несовершенство парсер используемого в Немерле 1.х. Этот шаг решат ряд проблем от поддержки синтаксиса основанного на отступах, до формирования тех самых окружений хранящих информацию об открытых синтаксических окружениях.
ME> На этом этапе формируется так называемое «окружение»(где жаргонный термин?).
Не понял вопроса. Далее же объясняется, что такое окружение.
ME>В окружении сохраняется информация об открытых пространствах имен, а значит, доступных макросах и операторах.
ME>Фаза парсинга. Производит парсинг. Он состоит из создания AST верхнего уровня (TopDeclaration) (нет четкого примера в описании синтаксиса;
Подразумевается, что человек читающий эту статью, должен уже знать такие вещи. Читй 6-ю часть "Язык Немерле" или доки по синтаксису на сайте.
ME>Фаза перед наследованием. Запуск макросов BeforeInheritance.
Тут верно, только не "макросов BeforeInheritance", а макросов (можно даже сказать макросов верхнего уровня) работающих на фазе BeforeInheritance. Именно по этому не надо называть фазами еще что-то.
ME>Фаза наследования. Строится дерево наследования агрегатов. Дерево строится на основании информации об импортированных из других сборок агрегатов и на основании TopDeclaration разобранных исходных файлов.
Как я уже говорил, "агрегаты" — это твоя самопальная терминология которая здесь не к месту. Здесь под "Производит разрешение наследования" понимается связывание описаний супертипов для типов отпарсеных из исходников и сформированных макросами (другим словами не загруженных из внешних сборок). Для типов из внешних сборок информация о супертипах доступна сразу.
ME>[u](выброшеная фаза: Производит разрешение наследования (задает отношения между типами), т.к. она излишняя)
Зря. Это как раз правильная фраза. Как я уже говорил это поверхностное описание. Здесь полноты и не требовалось. Цели другие.
ME>Фаза перед типизацией членов. Запуск макросов BeforeTypedMembers.
Ага. Фаза макросов BeforeTypedMembers. Ну, да про фазы повторяться не буду.
ME>Фаза типизации членов. Типизируются члены агрегатов,
Традиционно "агрегатов" в топку. Можно было бы написать "пользовательских типов определенных в проекте", но опять таки для этой статьи — это какой-то оверкил в области разжевывание очевидных для целевой аудитории вещей.
ME>т.е. связываются текстовые (че??? у нас же вроде AST везде?)
В AST имена в текстовой форме и лежат. Как им еще можно лежать то?
ME>описания типов параметров и возвращаемых значений с типами из дерева агрегатов. Компилятор не допускает вывода типов для членов агрегатов, поэтому после этого этапа становятся известными типы всех членов.
ME>Для методов это означает, что становятся известны типы аргументов и типы возвращаемых значений.
Масло масляное.
ME>Фаза типизации тел методов. (К методам относятся и конструкторы). Инициализаторы полей, а также getter-ы/setter-ы свойств преобразуются в методы (так, инициализаторы полей реально копируются в конструкторы агрегатов).
Это делается на стадии типизации членов, так как к тому времени когда типизируются тела вся информация о типах и их членах должна уже быть вычислена и проверена.
ME>Затем типизируются тела методов в агрегатах --
Традиционно агрегаты в топку
ME>раскрываются макросы WithTypedMembers и производится вывод типов.
Нет. Макрос работающие на фазе WithTypedMembers отрабатывают до начала типизации тел членов. Опять же читае 5-ю часть "Язык Немерле", где это хорошо расписано. Все фазы относятся к макросам верхнего уровня. Макросы раскрываемые при типизации тел относятся к макросам уровня выражений.
ME>Это самая сложная фаза компиляции. На выходе этой фазы тела методов содержат типизированный AST (TExpr). Состоит из следующих подфаз:
ME>
ME> Фаза раскрытия последних макросов. Раскрытие макросов в порядке их следования в нетипизированном AST (PExpr), что соответствует порядку их следованияв тексте программы. На выходе получается также нетипизированное AST, но уже не содержащее обращений к макросам.
ME> Фаза создания уравнений типизации. Вычисляются те соотношения, которые связывают типы. Эти соотношения мы назовем уравнениями типизации
ME> Фаза решения уравнений типизации. Уравнения решаются, и AST становится полностью типизированным.
ME>
Опять же, если бы ты прочел что написано дальше, то понял бы, что это очень поверхностное описание. Далее в статье было дано более глубокое и более точное описание:
Типизация осуществляется объектом Typer (из пространства имен Nemerle.Compiler). Он читает каждое выражение (осмысленное сочетание веток AST) нетипизированного AST – PExpr. Проверяет, не совпадает ли выражение с шаблоном, описанным в одном из макросов уровня выражения (который «виден» в данной области видимости). Если выявляется совпадение, то выражение передается на обработку этому макросу. Перед передачей выражения макросу типизатор производит декомпозицию выражения в соответствии с шаблоном, описанным в макросе. При этом выражение может быть разбито на подвыражения для соответствия параметрам макроса.
...
и далее по тексту.
Основная мысль заключается в том, что макросы раскрываются во время типизации, но до типизации непосредственно конкретного выражения которое поражается макросом. Кроме того макрос возвращает выражения в которых так же могут встречаться макросы. Типизатор разбирает результирующее выражение (которое возвратил макрос) и типизироует его по путно раскрывая те макросы которые есть в нем. Результатом работы типизатор всегда является TExpr. В TExpr макросов уже быть не может. Зато в нем есть типы и разрешенные имена. Однако типы могут быть не вывденными, а подветки TExpr могут содержать объект отложенной типизации.
как раз и рассказывает о типах и объектах отложенной типизации, а не является описанием чего-бы то ни было другого (языка в частности).
ME>Фаза оптимизации. Производятся различные преобразования над типизированым AST, оптимизация и т.п. (что и т.п.?)
Там много чего делается. Это не важно в контексте статьи. Например, проверяется достижим ли код и выдаются предупреждения о его недостижимости.
ME>Фаза генерации. Производится генерация IL.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
своем сообщении, то ты скорее запутал, чем что-то разжевал. Я тебе там дал подробный ответ. Хотя, откровенно говоря, не вижу смысла вообще это обсуждать. Ты просто взялся не за ту статью и начал разбирать в ней не существенные детали (вводную).
ME>в первую очередь, давай выясним не ошибся ли я и правильно ли все понял
.
ME>в частности, удаленная мной фаза (см. в тексте) действительно является пересказом соседней, или я не разобрался?
Это какая? Вообще, я не понимаю зачем ты всем этим занялся.
ME>если интересно почему я считаю, что это шлифовка, то тоже могу написать, но объем будет примерно как у самого текста
Я вообще не понимаю смысла твоих действий. Не надо быть провидцем, чтобы предсказать, что из затеи твоей ничего хорошего не получится. Ведь ты пока что не в теме того что пытаешь шлифовать. А текст этот рассчитан на тех кто в теме и ни разу не претендует на описание языка или даже компилятора. Это просто вводная для темы типизации в макросах.
ME>вкратце: фазы компиляции *нельзя* именовать цифрами, да еще написанными не от руки, а полученными через нумерованный список (и если у фаз есть общепринятые названия, отличные от моих, то их надо указать)
VD>Я вообще не понимаю смысла твоих действий. Не надо быть провидцем, чтобы предсказать, что из затеи твоей ничего хорошего не получится. Ведь ты пока что не в теме того что пытаешь шлифовать.
не надо быть поваром, чтобы понять, что блюдо подгорело
да, непонимание может быть следствием как того, что я не в теме, так и удручающе неподходящего стиля изложения
VD>Я вообще не понимаю смысла твоих действий. Не надо быть провидцем, чтобы предсказать, что из затеи твоей ничего хорошего не получится.
собственно, я и не собираюсь чтобы из моей затеи что-то "получилось" в твоем понимании — мне достаточно, чтобы я имел у себя описание немерле, соответствующее действительности, и написанное тем языком, который я считаю подходящим для спецификации, а не охами-вздохами "ай как это сложно" (можешь посчитать охи в 4-й части)
можно, конечно, попросить вашу команду написать описание немерле 1 на человеческом языке, но я подозреваю, что это не будет сделано -- вы скорее будете заниматься немерле 2 (кстати, по нему я тоже потом задам вопросы)
VD> А текст этот рассчитан на тех кто в теме и ни разу не претендует на описание языка или даже компилятора. Это просто вводная для темы типизации в макросах.
в эн+1 раз спрашиваю: а где описание немерле 1?
кстати, 6-я часть опять описывает скорее парсер, чем синтаксис!
мне видимо опять-таки придется для себя из нее сделать выжимку, с моей точки зрения подходящую под описание языка, и задать вопросы
да, я бы тебе эти так беспокоящие тебя выжимки не показывал, но, похоже, это единственный способ выяснить, где я понял что-то неверно
VD> За одно почему-то посчитал, что фазы используемые макросах должны иметь четкое отображение на этапы компиляции. Зависимость несоменнно есть, но фазы макросов идут как бы между этапами компиляции.
вот и хорошо
осталось заменить слова "как бы" на более точные (или выбросить вообще?)
VD>2. Ты взялся за чтение текста предназначенного для тех кто уже разбирается в макросах и языке и хочет углубить свои знания. Читать "расширенный курс" не зная языка и не имея опыта создания макросов — это не верный шаг. Так ты только запутаешься.
ровно наоборот -- создавать макросы, не имея общей картины -- это признак code monkey
пожалуста перестань мне советовать стать code monkey -- это бесполезно
ME>>для начала назовем агрегатами
VD>Не. Так мы делать не будем. Это какая-то самодеятельность.
не делайте -- оно сделано для того, чтобы мне было легче выяснить, что спрашивать о немерле (впрочем, будь я дизайнером языка, я бы ввел это понятие)
VD>Наследование поддерживается только в классах, интерфейсах и от части в структурах и перечислениях. При этом есть масса нюансов. Полностью наследование доступно только для классов и интерфейсов.
а есть ли члены в чем-то, кроме как в классах, интерфейсах, в структурах? в перечислениях скажем?
VD>Первое что хочется заметить — оригинальный список является поверх и от того не вполне корректным. В нем намеренно были сделаны не некоторые вольные допущения. Если уж хочется разобраться глубже, то придется их устранить.
ок
VD>Второе замечание — использования термина "фаза" здесь не уместно, так как оно входит в конфликт с термином используемым для обозначения фазы работы макросов (которая так же иногда называется фазой компиляции). Наверно имеет смыл по моим текстам поправить "фазы компиляции" на "фазы работы макросов".
ммм... у вас макросы -- это части компилятора; почему нельзя отвести часть фаз компиляции под части работы макросов?
VD>Это детали не относящиеся к делу. Если вкратце, сворачивание по скобкам обходит несовершенство парсер используемого в Немерле 1.х. Этот шаг решат ряд проблем от поддержки синтаксиса основанного на отступах, до формирования тех самых окружений хранящих информацию об открытых синтаксических окружениях.
что такое скобки? это "(){}[]" или есть еще какие? почему это названо несовершенством?
ME>>Он состоит из создания AST верхнего уровня (TopDeclaration) (нет четкого примера в описании синтаксиса;
VD>Подразумевается, что человек читающий эту статью, должен уже знать такие вещи. Читй 6-ю часть "Язык Немерле" или доки по синтаксису на сайте.
и где в 6-й части дано *определение* TopDeclaration? там такого слова вообще нет
VD> или доки по синтаксису на сайте.
я уже догадался по смыслу
ME>>Фаза типизации членов. Типизируются члены агрегатов,
VD>Традиционно "агрегатов" в топку. Можно было бы написать "пользовательских типов определенных в проекте", но опять таки для этой статьи — это какой-то оверкил в области разжевывание очевидных для целевой аудитории вещей.
делагат является пользовательским типом; есть ли у него члены? типизируются ли члены делегатов на этой фазе?
ME>>т.е. связываются текстовые (че??? у нас же вроде AST везде?)
VD>В AST имена в текстовой форме и лежат. Как им еще можно лежать то?
ex4> Типизирует члены типов, т.е. связывает текстовые описания типов параметров и возвращаемых значений с типами из дерева типов.
"текстовые описания типов параметров" -- описания это не имена
или у вас описание типов параметров может состоять только из имени? и не-имена List[T] (или если пофантазировать List[T+U+V-W]) в качестве описание типов параметров недоступны? или все еще они неразобраны (т.е. в тексте)?
ME>>Для методов это означает, что становятся известны типы аргументов и типы возвращаемых значений.
VD>Масло масляное.
гыгы
это я перенес твое "типы аргументов и возвращаемых значений известны перед началом процесса типизации" в то место, где оно должно было бы стоять, и чуть изменил формулировку
ME>>Фаза типизации тел методов. (К методам относятся и конструкторы). Инициализаторы полей, а также getter-ы/setter-ы свойств преобразуются в методы (так, инициализаторы полей реально копируются в конструкторы агрегатов).
VD>Это делается на стадии типизации членов, так как к тому времени когда типизируются тела вся информация о типах и их членах должна уже быть вычислена и проверена.
ясно
ME>>раскрываются макросы WithTypedMembers и производится вывод типов.
VD>Нет. Макрос работающие на фазе WithTypedMembers отрабатывают до начала типизации тел членов. Опять же читае 5-ю часть "Язык Немерле", где это хорошо расписано. Все фазы относятся к макросам верхнего уровня. Макросы раскрываемые при типизации тел относятся к макросам уровня выражений.
почти ясно
а на какой фазе (между какими фазами) работают макросы уровня выражений?
ME>>Это самая сложная фаза компиляции. На выходе этой фазы тела методов содержат типизированный AST (TExpr). Состоит из следующих подфаз:
VD>Опять же, если бы ты прочел что написано дальше, то понял бы, что это очень поверхностное описание. Далее в статье было дано более глубокое и более точное описание: VD>[q] VD>Типизация осуществляется объектом Typer (из пространства имен Nemerle.Compiler)
естественно я это прочитал, но это относится к деталям реализации
VD>Основная мысль заключается в том, что макросы раскрываются во время типизации, но до типизации непосредственно конкретного выражения которое поражается макросом. Кроме того макрос возвращает выражения в которых так же могут встречаться макросы. Типизатор разбирает результирующее выражение (которое возвратил макрос) и типизироует его по путно раскрывая те макросы которые есть в нем. Результатом работы типизатор всегда является TExpr. В TExpr макросов уже быть не может. Зато в нем есть типы и разрешенные имена. Однако типы могут быть не вывденными, а подветки TExpr могут содержать объект отложенной типизации.
так, это я обдумаю
насчет агрегатов -- хотя язык и не мой, но я могу (и буду) вводить свою терминологию для его описания; я, естественно, постараюсь излишне не перегружать всех вас этой самопальной терминологией, но использовать ее скорее всего продолжу, т.к. она позволяет мне лучше задавать вопросы