Генератор исходника Nemerle из C# - первая версия
От: CodingUnit Россия  
Дата: 29.06.11 13:08
Оценка: 91 (7)
Здравствуйте, VladD2, Вы писали:

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


CU>>Да я с Владом согласен, TopDeclaration там и интерфейсы, альясы, делегаты, помимо больших классов, поэтому их каждый в свой файл как то не красиво. Вариант с обработкой NamespaceNode из CSharpParser мне кажется более похож на реальность. Хотя это годится для конвертера из C#, для обычной печати надо придумывать другой способ, наверное надо обрабатывать NamespaceNode в которых находятся TopDeclaration и сортировать их по позициям, тогда должны быть точно известны позиции Location, они известны при парсинге, но если добавляется член в макросе, то его надо грамотно подключить к текущему пространству.


VD>"Обычная" печать одна для чего нужна? Я так понимаю только для отладки. А для отладки совершенно по фигу где лижит тип. Можно каждый тип сувать в отдельный файл. А алиасы печатать для отладки просто нет смысла.


VD>+1 Если только, конечно, пользователь сам не хочет разложить все поп полочкам. А это можно некой настройкой сделать.


Залил код проекта в каталог Snippets\csharp-parser\CSharpToNemerleSource просьба всем тестировать и смотреть.
Конечно много еще недоделок и замечаний, которые надеюсь общими усилиями со временем устраним.
Что сделано:

1) Утилита конвертирования из C# в Nemerle файлы, парсится все как есть С# парсером, выводится в файл, по печати есть замечания (ниже)
2) Печать дерева (list[TopDeclaration]) в файл:
а) печать всех элементов TopDeclaration и ClassMember включая аттрибуты, генерики, ограничения, авто-свойства, ручные события, может что и упустил, со временем думаю все дополним, жду замечаний.

б) большая часть печати взята из ClassMember и дополнена, поэтому после тестинга и согласия сообщества, можно переводить код из сниппетов в компилятор для печати отладочных исходников через ClassMember.PrintBody и TopDeclaration

г) простенькое форматирование, отступы, using печатаются по информации в ManagerClass для соотв. файла, namespace печатается одно на группу объявлений в файле

д) Можно существующие исходники N парсить и печатать для тестирования движка

что еще не поддерживается:
а) печать отладки хотя потенциально может быть, но еще не тестировалась, все надо переводить из сниппетов в компилятор при согласии сообщества
б) печать макросов хромает, по крайней мере сейчас, плохо печатается тело макроса — цитата, тут надо смотреть PrettyPrint
в) #define, xml комментарии и остальные директивы препроцессора пока не печатаются, думаю скоро заполним пробел

Поэтому можете юзать, хотя не полно но частично уже ее можно использовать, PrettyPrint кое где изгаживает тела методов, его я пока не касался, но думаю и его можно подкорректировать со временем. Кто хочет может править, и вносить изменения не меняющие идеологии, проект открыт. А также замечания и баг-репорты.

Далее хочу написать замечания о реализации, здесь чисто технические детали:

1) Есть ли в Nemerle неявные операторы приведения типа, как в С#: static implicit operator double()
для текущего класса, как их печатать в Nemerle, нигде не могу найти синтаксис? Тоже и про explicit?

2) Макросы сейчас печатаются с ошибкой Error в квази-цитате, есть пример в сниппетах, там это показано в каталоге Converted сконверченные файлы Sample.n. Вопрос вот в чем, что надо сделать чтобы они печатались правильно, тут конечно все дело в PrettyPrint
но где смотреть, у него есть параметр Typer который в него можно подать от него зависит внутренне раскрытие макросов в PrettyPrint. может его надо туда надо правильно подать, но откуда взять Typer в таком режиме компиляции, когда мы отдельно от макроса в ManagerClass есть ComponentFactory его можно оттуда создать, или получить его другим образом? В чем может быть еще дело?

3) В дереве есть странные возможности типа параметры типов в enum и макросах (Typarms) существуют ли такие в природе языка и как их печатать?

4) Откуда взять информацию о пространстве имени типа (в котором находится тип), оно есть как я вижу в TopDeclaration.FullName, и его можно получить удалив имя самого класса из строки, может есть какие то более прямые способы?

5) Как получить информацию о using в файле, сейчас удалось получить ее из referenced_namespace_nodes класса NamespaceTree для этого пришлось открыть через extension метод, далее их надо фильтровать по информации Location. может есть другие прямые способы?

6) Сейчас часть утилиты сделана на русском, часть на аглицком, как лучше сделать чтобы комрады за границей могли пользоваться утилитой, есть вариант сделать отдельно на английском, можно переключать язык, можно делать только на английском надеясь что наши разберутся, как поступить?

7) PrettyPrint нуждается в коренной промывке мозгов, могу ли я этим заняться? может быть после этого несколько изменится печать отладочных исходников на данный момент.

Прошу всех ребят, кто может дать комментарии на сии волнующие вопросы писать ответы. Кто хочет может подключаться и исправлять код.
В DeclPrinter.n и DeclPrinterInit.n находится сам движок печати, который является кандидатом на замену текущей печати отладки.

ЗЫ: TopDeclarationPrettyPrint не стал обзывать поскольку там в большинстве не только TopDeclaration печататается, но и ClassMember члены.

29.06.11 18:43: Ветка выделена из темы Генератор исходника Nemerle из дерева и из C#
Автор: CodingUnit
Дата: 22.06.11
— VladD2
Re: Генератор исходника Nemerle из C# - первая версия
От: Mumitroller Беларусь  
Дата: 29.06.11 14:39
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Залил код проекта в каталог Snippets\csharp-parser\CSharpToNemerleSource просьба всем тестировать и смотреть.


Ты забыл еще закоммитить свой своп-файл.

Похоже, что планируемый гитовский репозитарий заметно подрастет из-за этого коммита.

Mumitroller
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[2]: Генератор исходника Nemerle из C# - первая версия
От: CodingUnit Россия  
Дата: 29.06.11 14:41
Оценка:
Здравствуйте, Mumitroller, Вы писали:

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


CU>>Залил код проекта в каталог Snippets\csharp-parser\CSharpToNemerleSource просьба всем тестировать и смотреть.


M>Ты забыл еще закоммитить свой своп-файл.


M>Похоже, что планируемый гитовский репозитарий заметно подрастет из-за этого коммита.


M>Mumitroller


Прошу прощения еще мало опыта работы с свн. Постараюсь исправиться
Re[3]: Генератор исходника Nemerle из C# - первая версия
От: Ziaw Россия  
Дата: 29.06.11 14:48
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Прошу прощения еще мало опыта работы с свн. Постараюсь исправиться


Ничего, постараюсь вырезать. В гите подобную ошибку допустить сложнее. Там игноры глобальные.
Re: Генератор исходника Nemerle из C# - первая версия
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.06.11 15:03
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>1) Утилита конвертирования из C# в Nemerle файлы, парсится все как есть С# парсером, выводится в файл, по печати есть замечания (ниже)


Утилита — это как-то очень уж неудобно. Подобная функциональность нужна в интеграции. Чтобы можно было преобразовать код находящийся сейчас в клипборде. Так же возможно имеет смысл сделать конвертацию файла при добавлении в проект. Естественно это должно быть отдельным пунктом меню или как-то еще (чтобы был выбор).

CU>Поэтому можете юзать, хотя не полно но частично уже ее можно использовать, PrettyPrint кое где изгаживает тела методов, его я пока не касался, но думаю и его можно подкорректировать со временем.


Этим стоит заняться. PrettyPrint далек от совершенства.

CU>Далее хочу написать замечания о реализации, здесь чисто технические детали:


CU>1) Есть ли в Nemerle неявные операторы приведения типа, как в С#: static implicit operator double()

CU> для текущего класса, как их печатать в Nemerle, нигде не могу найти синтаксис? Тоже и про explicit?

Есть. Как и все операторы имеет синтаксис:
static @НаименованиеОператора(arg1 : Type, arg2 : Type) : Type

для бинарного оператора. И с одним аргументом для унарного.

CU>2) Макросы сейчас печатаются с ошибкой Error в квази-цитате, есть пример в сниппетах, там это показано в каталоге Converted сконверченные файлы Sample.n. Вопрос вот в чем, что надо сделать чтобы они печатались правильно, тут конечно все дело в PrettyPrint но где смотреть, у него есть параметр Typer который в него можно подать от него зависит внутренне раскрытие макросов в PrettyPrint. может его надо туда надо правильно подать, но откуда взять Typer в таком режиме компиляции, когда мы отдельно от макроса в ManagerClass есть ComponentFactory его можно оттуда создать, или получить его другим образом? В чем может быть еще дело?


CU>3) В дереве есть странные возможности типа параметры типов в enum и макросах (Typarms) существуют ли такие в природе языка и как их печатать?


Нет. Это просто результат обобщения (кривой дизайн).

CU>4) Откуда взять информацию о пространстве имени типа (в котором находится тип), оно есть как я вижу в TopDeclaration.FullName, и его можно получить удалив имя самого класса из строки, может есть какие то более прямые способы?


Из объекта типа GlobalEnv. Там есть текущее пространство имен. Для TopDeclaration его можно получить с помощью метода TryGetEnv(). Подробности можно подглядеть в реализации того же FullName.

CU>5) Как получить информацию о using в файле, сейчас удалось получить ее из referenced_namespace_nodes класса NamespaceTree для этого пришлось открыть через extension метод, далее их надо фильтровать по информации Location. может есть другие прямые способы?


Для cs-файлов можно взять из их АСТ. Для немерловых все сложнее. Эту информацию опять же можно вытащить из экземпляра GlobalEnv. Там есть список открытых пространств имен.

CU>6) Сейчас часть утилиты сделана на русском, часть на аглицком, как лучше сделать чтобы комрады за границей могли пользоваться утилитой, есть вариант сделать отдельно на английском, можно переключать язык, можно делать только на английском надеясь что наши разберутся, как поступить?


Думаю что русский язык никому не нужен. Нужно оставить только английскую версию.

CU>7) PrettyPrint нуждается в коренной промывке мозгов,


+1

CU>могу ли я этим заняться? может быть после этого несколько изменится печать отладочных исходников на данный момент.


Да, можете. Только нужно тщательно все тестировать. В том числе и многопроходную сборку компилятора.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Генератор исходника Nemerle из C# - первая версия
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.06.11 15:04
Оценка: 1 (1)
Здравствуйте, Ziaw, Вы писали:

Z>В гите подобную ошибку допустить сложнее. Там игноры глобальные.


Как показала практика, если ошибку можно допустить хотя бы теоретически, то она будет допущена .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Генератор исходника Nemerle из C# - первая версия
От: hardcase Пират http://nemerle.org
Дата: 29.06.11 15:25
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Прошу прощения еще мало опыта работы с свн. Постараюсь исправиться


Просто нужно смотреть какие изменения выполнены в ревизии перед нажатием на кнопку Commit.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Генератор исходника Nemerle из C# - первая версия
От: Ziaw Россия  
Дата: 29.06.11 15:44
Оценка:
Здравствуйте, VladD2, Вы писали:

Z>>В гите подобную ошибку допустить сложнее. Там игноры глобальные.


VD>Как показала практика, если ошибку можно допустить хотя бы теоретически, то она будет допущена .


Абсолютно верно. Потому я и написал — сложнее. Вдобавок там есть еще один фильтр, пуллреквест.
Re[2]: Генератор исходника Nemerle из C# - первая версия
От: CodingUnit Россия  
Дата: 29.06.11 16:24
Оценка:
Здравствуйте, VladD2, Вы писали:

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


CU>>1) Утилита конвертирования из C# в Nemerle файлы, парсится все как есть С# парсером, выводится в файл, по печати есть замечания (ниже)


VD>Утилита — это как-то очень уж неудобно. Подобная функциональность нужна в интеграции. Чтобы можно было преобразовать код находящийся сейчас в клипборде. Так же возможно имеет смысл сделать конвертацию файла при добавлении в проект. Естественно это должно быть отдельным пунктом меню или как-то еще (чтобы был выбор).


Нужно — сделаем, можно и так и так, утилита я думаю никому не помешает. До интеграции доберемся, нужно сначала протестить сам движок и принцип. Движок открытый и использовать его в другой манере, в интеграции, не составит большого труда. Было бы хорошо сразу конвертить проекты из С# в N, хорошо и при добавлении С# файла в проект быстро его подключать к CSharpToNemerle парсеру hardcase, без сложных движений, может автоматически?

CU>>1) Есть ли в Nemerle неявные операторы приведения типа, как в С#: static implicit operator double()

CU>> для текущего класса, как их печатать в Nemerle, нигде не могу найти синтаксис? Тоже и про explicit?

VD>Есть. Как и все операторы имеет синтаксис:

VD>
VD>static @НаименованиеОператора(arg1 : Type, arg2 : Type) : Type
VD>

VD>для бинарного оператора. И с одним аргументом для унарного.

@double() для неявного преобразования в тип? а явное (explicit)?

CU>>2) Макросы сейчас печатаются с ошибкой Error в квази-цитате, есть пример в сниппетах, там это показано в каталоге Converted сконверченные файлы Sample.n. Вопрос вот в чем, что надо сделать чтобы они печатались правильно, тут конечно все дело в PrettyPrint но где смотреть, у него есть параметр Typer который в него можно подать от него зависит внутренне раскрытие макросов в PrettyPrint. может его надо туда надо правильно подать, но откуда взять Typer в таком режиме компиляции, когда мы отдельно от макроса в ManagerClass есть ComponentFactory его можно оттуда создать, или получить его другим образом? В чем может быть еще дело?


Прошу этот вопрос осветить, поскольку я все еще не знаю как сделать чтобы макросы печатались, тут надо пересматривать алгоритм PrettyPrint или есть простой выход с правильным использованием Typer в его параметрах? Тот пример использует в себе несколько вызовов when и if в квазицитате, но PrettyPrint не хочет их раскрывать в свои имена, есть ли тут простой выход?

CU>>7) PrettyPrint нуждается в коренной промывке мозгов,


VD>+1



VD>Да, можете. Только нужно тщательно все тестировать. В том числе и многопроходную сборку компилятора.

По поводу многопроходной сборки, вопрос, мне как то друг сказал что компилятор gnu gcc может себя пересобирать не более 20 раз, потом слетает, сколько проходов выдержит наш компилятор? Есть двухпроходная сборка в батниках, этого достаточно?
Re[3]: Генератор исходника Nemerle из C# - первая версия
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.06.11 16:50
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Было бы хорошо сразу конвертить проекты из С# в N, хорошо и при добавлении С# файла в проект быстро его подключать к CSharpToNemerle парсеру hardcase, без сложных движений, может автоматически?


Подключаешь cs-файл к проекту, задаешь в его свойствах Compile и он начинает компилироваться.

CU>@double() для неявного преобразования в тип? а явное (explicit)?


Я же сказал — оператор. Стало быть для явного:
@:>(x : T1) : T2

а для не явного:
@:(x : T1) : T2

CU>>>2) Макросы сейчас печатаются с ошибкой Error в квази-цитате, есть пример в сниппетах, там это показано в каталоге Converted сконверченные файлы Sample.n. Вопрос вот в чем, что надо сделать чтобы они печатались правильно, тут конечно все дело в PrettyPrint но где смотреть, у него есть параметр Typer который в него можно подать от него зависит внутренне раскрытие макросов в PrettyPrint. может его надо туда надо правильно подать, но откуда взять Typer в таком режиме компиляции, когда мы отдельно от макроса в ManagerClass есть ComponentFactory его можно оттуда создать, или получить его другим образом? В чем может быть еще дело?

CU>Прошу этот вопрос осветить, поскольку я все еще не знаю как сделать чтобы макросы печатались, тут надо пересматривать алгоритм PrettyPrint или есть простой выход с правильным использованием Typer в его параметрах?


Ну, кто его знает? Тут надо смотреть... скорее всего под отладчиком... серьезно разбираться.

CU>Тот пример использует в себе несколько вызовов when и if в квазицитате, но PrettyPrint не хочет их раскрывать в свои имена, есть ли тут простой выход?


Ну, вот и надо смотреть что и почему там не раскрывается. В компиляторе это все печатается.

CU>По поводу многопроходной сборки, вопрос, мне как то друг сказал что компилятор gnu gcc может себя пересобирать не более 20 раз, потом слетает,


Это чушь какая-то. Или ошибка в gcc.

CU>сколько проходов выдержит наш компилятор?


Если выдержит (после изменений) два прохода, то с огромной вероятностей выдержит и миллион . Вот только зачем? Достаточно прогонять хотя бы двухпроходную компиляцию (DevBuild2StageWithTests.cmd). А лучше четырехпроходную (DevBuildForCommit.cmd).

CU>Есть двухпроходная сборка в батниках, этого достаточно?


Да. См. выше.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Генератор исходника Nemerle из C# - первая версия
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.06.11 16:57
Оценка:
Здравствуйте, CodingUnit, Вы писали:

Замечание по форматированию кода. Надо отбивать операторы пробелами. Во-первых, читать код в котором операторы и операнды слились в единую строку, банально, тяжело. А, во-вторых, это может привести к ошибкам, так как в Н оператором считается последовательность операторных символов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Генератор исходника Nemerle из C# - первая версия
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.06.11 17:09
Оценка:
Здравствуйте, CodingUnit, Вы писали:

Почитайте что-нибуть по работе с SVN. В прошлом комите вы снесли сделанные мной изменения. Я поправил ссылки на сборки, так чтобы в них был не полный путь, а путь использующий переменную Nemerle, а вы откатили эти изменения.

Перед комитот нужно смотреть, что за изменения вы сделали и комитить только, если понимаете, что и зачем изменено.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Генератор исходника Nemerle из C# - первая версия
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.06.11 17:16
Оценка:
Здравствуйте, VladD2, Вы писали:

Я откатил ваши изменения в сделанные проекте и поправил форматирование.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Генератор исходника Nemerle из C# - первая версия
От: CodingUnit Россия  
Дата: 29.06.11 17:27
Оценка:
Здравствуйте, VladD2, Вы писали:

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


VD>Почитайте что-нибуть по работе с SVN. В прошлом комите вы снесли сделанные мной изменения. Я поправил ссылки на сборки, так чтобы в них был не полный путь, а путь использующий переменную Nemerle, а вы откатили эти изменения.


VD>Перед комитот нужно смотреть, что за изменения вы сделали и комитить только, если понимаете, что и зачем изменено.


Я несколько раз пытался апдейтить исходники перед коммитом, и меня всегда заботил вопрос как быть если внесены изменения другим человеком, они же должны объеденяться с другими изменениями других людей работающими над теми же файлами, это по моему называется разрешением конфликтов. Да я видел недостатки в файлах проектов и выводе, хотел их исправить тоже, прости Влад если нечаянно сбил твои изменения.
Re[3]: Генератор исходника Nemerle из C# - первая версия
От: CodingUnit Россия  
Дата: 29.06.11 17:39
Оценка:
Здравствуйте, VladD2, Вы писали:

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


VD>Я откатил ваши изменения в сделанные проекте и поправил форматирование.


Хорошо.




от макросов до вариантов
и массой всяких преимуществ
благодаря nemerle-братству
программеров жизнь стала лучше
Re: Генератор исходника Nemerle из C# - первая версия
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.06.11 19:51
Оценка:
Здравствуйте, CodingUnit, Вы писали:

Немного отрефакторил проект. Перенес тестовые файлы в тестовый проект и наладил их копирование в каталог с ехе-ником.

Теперь, некоторые замечания...

1. Все функции конвертации должны на входе получать пути к входному и выходному файле, а не заниматься какой-то хиромантией с путями. Вся логика работы с путями должна быть вовне по отношению к конвертеру.

2. Конвертированные файлы лучше копировать в отдельный каталог. Для этого в тестах просто можно задавать что-то вроде:
    conv.Convert   (@"TestFiles\test.cs",  @"ConvertedFiles\test.n");
    conv.PrintNFile(@"TestFiles\sample.n", @"ConvertedFiles\sample.n");


3. Разбирать командную строку нужно с помощью модуля Nemerle.Utility.Getopt который входит в стандартную библиотеку. То как его нужно применять можно увидеть в коде компилятора.

4. В сконвертированном коде вместо if-ов используются match-и. Это не верно. Нужно использовать стандартные макросы. Ведь именно в них разворачиваются (вроде бы) C#-ные конструкции.

5. Странным выгдядит код вроде:
_  = Valid = true

зачем этот префикс "_ = "?

6. Код конвертера должен находиться в библиотеке (библиотечном проекте) и уже в виде библиотеки использоваться из утилиты командной строки (и в последствии, в IDE). Так что надо создать еще один проект в котором оставить только работу с командной строкой и вызов конвертера, а в исходном проекте оставить только сам конвертер.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Генератор исходника Nemerle из C# - первая версия
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.06.11 15:05
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Я несколько раз пытался апдейтить исходники перед коммитом, и меня всегда заботил вопрос как быть если внесены изменения другим человеком, они же должны объеденяться с другими изменениями других людей работающими над теми же файлами, это по моему называется разрешением конфликтов.


Невозможно незаметно для себя перезаписать изменения другого человека. Если комитишь поверх чужих изменений, то вылезает сообщение об ошибке.

При этом нужно проапдэйтить свою локальную копию исходников. Если при апдэйте вылезают конфликты, то их нужно разрешать. Для этого в Тортиле (SVN-клиенте) есть специальный GUI (Merge). С его помощь нужно сравнить две версии и перенести в свою локальную копию те изменения которые имеют смысл.

Далее нужно собрать проект и убедиться, что все ОК.

Ну, а там уже комитить как простые изменения.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Генератор исходника Nemerle из C# - первая версия
От: CodingUnit Россия  
Дата: 06.07.11 15:37
Оценка: 47 (1)
Здравствуйте, VladD2, Вы писали:

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


VD>Немного отрефакторил проект. Перенес тестовые файлы в тестовый проект и наладил их копирование в каталог с ехе-ником.


Это хорошо.

VD>Теперь, некоторые замечания...


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


Это уже сделал, также вынес отдельно модуль DeclPrettyPrint чтобы его переносить со временем в компилятор.

VD>2. Конвертированные файлы лучше копировать в отдельный каталог. Для этого в тестах просто можно задавать что-то вроде:

VD>
VD>    conv.Convert   (@"TestFiles\test.cs",  @"ConvertedFiles\test.n");
VD>    conv.PrintNFile(@"TestFiles\sample.n", @"ConvertedFiles\sample.n");
VD>


Постарался сделать это

VD>3. Разбирать командную строку нужно с помощью модуля Nemerle.Utility.Getopt который входит в стандартную библиотеку. То как его нужно применять можно увидеть в коде компилятора.


Это посмотрю спасибо за совет

VD>4. В сконвертированном коде вместо if-ов используются match-и. Это не верно. Нужно использовать стандартные макросы. Ведь именно в них разворачиваются (вроде бы) C#-ные конструкции.


VD>5. Странным выгдядит код вроде:

VD>
VD>_  = Valid = true
VD>

VD>зачем этот префикс "_ = "?

Про это надо конкретно поговорить, мне тоже это очень не нравится, я старался рыть в PrettyPrint, но он оказался невиноват, все дело в CSharpToNemerle конвертере Ast, там есть такая строчка в ConvertStatement

| Expression(expr) =>
          def expr = WithIntoExpression(false).ConvertExpr(expr);
          [Util.locate(loc, <[ _ = $expr ]>)]

,как я понимаю любой statement expression разворачивается в такую конструкцию, хорошо бы это подправить, тут вопрос к hardcase (респэкт ), там я видел TODO надо сделать правильно выражения без возвращаемых значений, в чем там сложность, я бы подправил лишь бы не повлияло на остальной код, может у автора есть тут свои мысли?
Для качественной конвертации требуется ваша помощь ребята и конкретно hardcase по улучшению движка CSharpToNemerle, чтобы Ast на входе был чистый, надеюсь на сотрудничество.

VD>6. Код конвертера должен находиться в библиотеке (библиотечном проекте) и уже в виде библиотеки использоваться из утилиты командной строки (и в последствии, в IDE). Так что надо создать еще один проект в котором оставить только работу с командной строкой и вызов конвертера, а в исходном проекте оставить только сам конвертер.


проект создал

Я обновил утилиту и немного повозился с PrettyPrint, что сделано:

1) Улучшил вывод match конструкций, лучше стали воспроизводится выражения as, when, with в паттернах, также слово in. запись из revsion comment:
— вывод функций без возвращаемых значений, печатались с обязательным _ если его не было, исправлено, также объявления функций не имеющие типов, печатались _ в типах. Надеюсь не погрешил.
— правильная печать сплайс строк, печатались Nemerle.IO.sprint(строка), решил поправить на обычный $, все равно sprint захардкожен в компиляторе
— def сложные объявления паттернов, не понимались, из за того что нужны скобки перед такими объявлениями, сделал так: объявлениям паттерна типа ref, tuple, в <[ def $pat = $e ]>, печатаются обычно, а остальные берутся в скобки, не знаю как еще распознать сложный паттерн их больно много
— исправлен вывод тела функции
— исправлен try catch вывод

В конвертере и движке печати, тоже ряд исправлений:
1) переписал движок утилиты с исправлениями на основе замечаний
1) исправил вывод макросов,
2) добавил потоковую конвертацию с рекурсивными путями что дает что целую кучу каталогов зараз можно сконвертить в другую папку
3) качество утилиты повысилось, теперь она по крайней мере может распарсить собственные исходники, распечатать и снова скомпилировать без ошибок
4) параметры по умолчанию, инициализаторы полей

Теперь хочу обговорить остальные детали и возникшие вопросы в процессе улучшения утилиты.
1) Когда беру из GlobalEnv TopDeclaration namespace, то в нем есть лишние объявления Nemerle.Core и Nemerle.Core.option удалил их на основе информации в CoreEnv, правильно ли это?

2) Когда беру из GlobalEnv namespace то их приходится перевернуть Rev чтобы они были как в файле, может стоит их иметь в таком виде внутри GlobalEnv изначально?

3) doc комментарии так и не нашел нигде, они что в при парсинге Nemerle и CSharpToNemerle остаются пустыми
4) тоже и с обычными комментариями не знаю где их найти, в ParseResult их нет?

5) В CsharpToNemerle на выходе есть ParseResult, но как бы получить доступ к Ast самого Csharp чтобы поиграться с комментариями или namespace или чем другим, может сделать интерфейс для доступа к нему?

6) Для того чтобы печатать тело метода которое представляет собой неявный match типа func(a) { |.. => }, в PrettyPrint надо смотреть за сигнатурой метода и match в дереве нет информации что тело является неявным match. Пытался сравнивать на основе строк, но бросил, может в компиляторе есть функции для сравнения сигнатур PExpr в параметрах функции и match (expr) чтобы проверить что они совпадают?

7) Рукурсивные строки невозможно распознать в дереве в PrettyPrint они являеются просто PExpr.Literal, и в конечном итоге получается большая обычная строка со множеством \r\n в теле, я думаю как правильно выяснить что это рекурсивная строка, может хранить информацию об них в дереве? можно смотреть через lexer что находится по location и так определять, но больно кривая зависимость от lexerа, или сканировать по какому то алгоритму саму строку, хотелось бы и их иметь при печати?

8) Вообще если довести печать до уровня, чтобы любой код Ast Nemerle мог себя печатать в исходный вид дает новый уровень полноты языка, и открывает доступ к интересным макросам, генераторам исходников, можно так генерить любой Ast после макроса в файл и потом его подключать без дополнительного вызова макроса

9) понадобилась функция RemoveDuplicates с предикатом, но ее почему то нет в стандартной библиотеке, написал свою на основе стандартной, может добавить ее в стандартную библиотеку, удаление дупликатов в сложных коллекциях обычное дело?

public static RemoveDuplicates[T](this lst : list[T], eq_pred : T * T -> bool) : list[T] 
    {
      def loop (lst, acc)  
      {
        match (lst)
        {
          | [] => 
              acc.Reverse()
          | [x] => 
              x :: acc.Reverse()
          | x :: ((y :: _) as xs) => 
              if (eq_pred(x, y)) loop(xs, acc); else loop(xs, x :: acc)
        }
      };
      loop(lst, [])
    }


Все еще есть недостатки в печати, когда проводил поточную конвертацию своих проектов заметил кое какие недостатки, не печатаются dsl в макроаттрибутах, в объявлениях макросов нет @ перед именем, есть ли он в Ast, не знаю, надо смотреть, буду улучшать.
Залил проект, постарался не погрешить, как в прошлый раз, проверил все много раз, некоторые файлы никак не хотели сразу коммитится и пришлось их отдельным коммитом потом добавлять, простите отцы если в чем погрешил. Жду комментариев.



от макросов до вариантов
и массой всяких преимуществ
благодаря nemerle-братству
программеров жизнь стала лучше
Re[3]: Генератор исходника Nemerle из C# - первая версия
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.07.11 17:50
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Про это надо конкретно поговорить, мне тоже это очень не нравится, я старался рыть в PrettyPrint, но он оказался невиноват, все дело в CSharpToNemerle конвертере Ast, там есть такая строчка в ConvertStatement


CU>
CU>| Expression(expr) =>
CU>          def expr = WithIntoExpression(false).ConvertExpr(expr);
CU>          [Util.locate(loc, <[ _ = $expr ]>)] 

CU>

CU>,как я понимаю любой statement expression разворачивается в такую конструкцию, хорошо бы это подправить, тут вопрос к hardcase (респэкт ), там я видел TODO надо сделать правильно выражения без возвращаемых значений, в чем там сложность, я бы подправил лишь бы не повлияло на остальной код, может у автора есть тут свои мысли?

Дело в том что шарп и немерл по разному реагируют на игнорирование возвращаемого функций значение. Немерл выдает предупреждение, если увидит, что теряется значение. Шарпу же по фигу. Это приводит к тому, что при компиляции шарпа немерловым компилятором выдается много предупреждений, большая часть которых не является проблемой (например, использование StringBuilder-а).

По всей видимости Хардкейс таким образом убрал это предупреждение. А так как "_ = ..." срабатывает даже в случае если тип выражения void, то он решил не напрягаться и тупо везде подставлять эту конструкцию.

CU>Для качественной конвертации требуется ваша помощь ребята и конкретно hardcase по улучшению движка CSharpToNemerle, чтобы Ast на входе был чистый, надеюсь на сотрудничество.


Свяжись с ним по Скайпу. Это самый быстрый способ.

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

CU>Теперь хочу обговорить остальные детали и возникшие вопросы в процессе улучшения утилиты.

CU>1) Когда беру из GlobalEnv TopDeclaration namespace, то в нем есть лишние объявления Nemerle.Core и Nemerle.Core.option удалил их на основе информации в CoreEnv, правильно ли это?

Не совсем понятно в чем вопрос. Давайте как еще раз, боле подробно (с примерами кода).

Nemerle.Core — это всегда открытое пространство имен. Nemerle.Core.option — это всегда открытый тип.
Но в GlobalEnv у конкретных типов должен быть так же список пространств имен которые были открыты при парсинге данного узла АСТ.

CU>2) Когда беру из GlobalEnv namespace то их приходится перевернуть Rev чтобы они были как в файле, может стоит их иметь в таком виде внутри GlobalEnv изначально?


Вот это трогать не надо. На это, скорее всего, завязаны некоторые куски компилятора. Так что можно его поломать.

CU>3) doc комментарии так и не нашел нигде, они что в при парсинге Nemerle и CSharpToNemerle остаются пустыми


Они пихаются в отдельные массивы. Подробности лучше уточнить у Хардкейса. Он вроде бы с ними разбирался.

CU>4) тоже и с обычными комментариями не знаю где их найти, в ParseResult их нет?


Собственно собираются все комментарии. Только там есть нюансы. Во-первых, нужно специальным образом включит сбор комментариев, а во-вторых, их нужно смотреть в специальном словаре Manager.DocComments (Manager — это ManagerClass, точнее свойство ссылающееся на него... сейчас оно есть почти в любом объекте).

CU>5) В CsharpToNemerle на выходе есть ParseResult, но как бы получить доступ к Ast самого Csharp чтобы поиграться с комментариями или namespace или чем другим, может сделать интерфейс для доступа к нему?


Это вопрос к Хардкейсу. Возможно нужно что-то подправить в конвертере.

CU>6) Для того чтобы печатать тело метода которое представляет собой неявный match типа func(a) { |.. => }, в PrettyPrint надо смотреть за сигнатурой метода и match в дереве нет информации что тело является неявным match.


Неявный match в АСТ выражается как match с null в качестве первого выражения:
<[ match($(null)) { ..$cases } ]>


CU>Пытался сравнивать на основе строк, но бросил, может в компиляторе есть функции для сравнения сигнатур PExpr в параметрах функции и match (expr) чтобы проверить что они совпадают?


Это вряд ли, так как для этого нужно типизировать код. Но зачем это нужно знать прети-принетеру? С тем же успехом может быть некорректным любой другой код.

CU>7) Рукурсивные строки невозможно распознать в дереве в PrettyPrint они являеются просто PExpr.Literal,


Можно. У вариантного типа Literal есть свойство RawString. В нем находится строка в том виде в котором она была в исходном файле. Вот только не уверен, что это будет работать для строк созданных с помощью квази-цитирования. Ну, да это можно исправить, если оно не так.

CU>8) Вообще если довести печать до уровня, чтобы любой код Ast Nemerle мог себя печатать в исходный вид дает новый уровень полноты языка, и открывает доступ к интересным макросам, генераторам исходников, можно так генерить любой Ast после макроса в файл и потом его подключать без дополнительного вызова макроса


Ага. Вот только зачем это нужно?

CU>9) понадобилась функция RemoveDuplicates с предикатом, но ее почему то нет в стандартной библиотеке, написал свою на основе стандартной, может добавить ее в стандартную библиотеку, удаление дупликатов в сложных коллекциях обычное дело?


CU>
CU>public static RemoveDuplicates[T](this lst : list[T], eq_pred : T * T -> bool) : list[T] 
CU>    {
CU>      def loop (lst, acc)  
CU>      {
CU>        match (lst)
CU>        {
CU>          | [] => 
CU>              acc.Reverse()
CU>          | [x] => 
CU>              x :: acc.Reverse()
CU>          | x :: ((y :: _) as xs) => 
CU>              if (eq_pred(x, y)) loop(xs, acc); else loop(xs, x :: acc)
CU>        }
CU>      };
CU>      loop(lst, [])
CU>    }
CU>


Это какой-то очень странный вариант. Он предполагает, что элементы упорядочены. Полноценная версия должна испльзовать хэш-таблицу и объект-компоратор. Такой вариант уже есть в LINQ.

CU>Все еще есть недостатки в печати, когда проводил поточную конвертацию своих проектов заметил кое какие недостатки, не печатаются dsl в макроаттрибутах,


А в чем проблема?

CU> в объявлениях макросов нет @ перед именем, есть ли он в Ast, не знаю, надо смотреть, буду улучшать.


Это вообще не понял. "@" делает ключевое слово идентификатором. Так что если есть имя совпадающее с ключевым словом, то к нему нужно добавить "@".

CU> простите отцы если в чем погрешил.




CU>

CU>от макросов до вариантов
CU>и массой всяких преимуществ
CU>благодаря nemerle-братству
CU>программеров жизнь стала лучше


+1
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Генератор исходника Nemerle из C# - первая версия
От: hardcase Пират http://nemerle.org
Дата: 06.07.11 19:08
Оценка:
Здравствуйте, CodingUnit, Вы писали:

VD>>5. Странным выгдядит код вроде:

VD>>
VD>>_  = Valid = true
VD>>

VD>>зачем этот префикс "_ = "?

CU>Про это надо конкретно поговорить, мне тоже это очень не нравится, я старался рыть в PrettyPrint, но он оказался невиноват, все дело в CSharpToNemerle конвертере Ast, там есть такая строчка в ConvertStatement


CU>
CU>| Expression(expr) =>
CU>          def expr = WithIntoExpression(false).ConvertExpr(expr);
CU>          [Util.locate(loc, <[ _ = $expr ]>)] 

CU>

CU>,как я понимаю любой statement expression разворачивается в такую конструкцию, хорошо бы это подправить, тут вопрос к hardcase (респэкт ), там я видел TODO надо сделать правильно выражения без возвращаемых значений, в чем там сложность, я бы подправил лишь бы не повлияло на остальной код, может у автора есть тут свои мысли?
CU>Для качественной конвертации требуется ваша помощь ребята и конкретно hardcase по улучшению движка CSharpToNemerle, чтобы Ast на входе был чистый, надеюсь на сотрудничество.

Конкретно присваивания можно (и нужно) лечить подобным образом:
        | Expression(expr) with isAssignment = expr is Expr.Assign =>
          def expr = WithIntoExpression(false).ConvertExpr(expr);
          [Util.locate(loc, if(isAssignment) expr else <[ _ = $expr ]>)]

Насчет вызовов сказать ничего нельзя так как "возвращаемость" значения можно определить лишь на этапе вывода типов, конвертер же работает задлого до типизатора.
Но в принципе прикрутить опцию совсем не долго.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Генератор исходника Nemerle из C# - первая версия
От: Ziaw Россия  
Дата: 08.07.11 05:24
Оценка:
Здравствуйте, Ziaw, Вы писали:

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


CU>>Прошу прощения еще мало опыта работы с свн. Постараюсь исправиться


Z>Ничего, постараюсь вырезать. В гите подобную ошибку допустить сложнее. Там игноры глобальные.


Вырезал-вырезал, да невырезал Не пойму, что пошло не так, но уже не исправить.
Re[5]: Генератор исходника Nemerle из C# - первая версия
От: Mumitroller Беларусь  
Дата: 08.07.11 06:55
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Вырезал-вырезал, да невырезал Не пойму, что пошло не так, но уже не исправить.


Почему не исправить? Теоретически — вроде возможность есть. Делаешь ответвление перед проблемным коммитом, а потом — rebase с выборочным объединением коммитов. Потом удаляешь старую ветку, а новой даешь такое же имя, как было у старой. После этого git gc вычистит все ставшие ненужными объекты. Но это в теории, практически я так еще ни разу не пробовал делать.

Mumitroller
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[6]: Генератор исходника Nemerle из C# - первая версия
От: Ziaw Россия  
Дата: 08.07.11 08:00
Оценка:
Здравствуйте, Mumitroller, Вы писали:

M>Почему не исправить? Теоретически — вроде возможность есть. Делаешь ответвление перед проблемным коммитом, а потом — rebase с выборочным объединением коммитов. Потом удаляешь старую ветку, а новой даешь такое же имя, как было у старой. После этого git gc вычистит все ставшие ненужными объекты. Но это в теории, практически я так еще ни разу не пробовал делать.


Можно сделать только новый мастер, но форки сломаются. Вобщем это не самая большая проблема, чтобы из за нее гемороиться. Я удалял эти бинарники, но потом обнуружил, что хардкейс отсутствует в юзерамаппингах Пришлось делать все заново и во втором удалении что-то пошло не так.
Re[7]: Генератор исходника Nemerle из C# - первая версия
От: Mumitroller Беларусь  
Дата: 08.07.11 08:22
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Можно сделать только новый мастер, но форки сломаются. Вобщем это не самая большая проблема, чтобы из за нее гемороиться. Я удалял эти бинарники, но потом обнуружил, что хардкейс отсутствует в юзерамаппингах Пришлось делать все заново и во втором удалении что-то пошло не так.


"Новый мастер" — это что имеется ввиду? Новый главный репозитарий на github или просто новая ветка master?

Если первое — то это как-то странно. Насколько я понимаю, git специально спроектирован так, чтобы можно было контролировать абсолютно все. В том числе и произвольно переписывать историю. Хотя, возможно, это я что-то неправильно понимаю, так как я только начинаю пользоваться git'ом.

А сколько стоит по размеру этот коммит в git'e? Дело в том, что размер 180М несколько напрягает при клонировании — надо иметь хороший интернет. Интересно, что там занимает столько места?

Mumitroller
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[8]: Генератор исходника Nemerle из C# - первая версия
От: Ziaw Россия  
Дата: 08.07.11 08:40
Оценка:
Здравствуйте, Mumitroller, Вы писали:

M>"Новый мастер" — это что имеется ввиду? Новый главный репозитарий на github или просто новая ветка master?


Новая ветка master. Это поломает клоны и форки. Не совсем конечно, но придется руками менять бранчи.

M>Если первое — то это как-то странно. Насколько я понимаю, git специально спроектирован так, чтобы можно было контролировать абсолютно все. В том числе и произвольно переписывать историю. Хотя, возможно, это я что-то неправильно понимаю, так как я только начинаю пользоваться git'ом.


Переписывать можно, только ты создаешь новые бранчи при этом. Старые бранчи можно удалить. Но надо понимать, что люди которые сделали клон/форк скачали эти старые бранчаи себе. И ведут разработку от них.

M>А сколько стоит по размеру этот коммит в git'e? Дело в том, что размер 180М несколько напрягает при клонировании — надо иметь хороший интернет. Интересно, что там занимает столько места?


Все помаленьку. Основное — бинарники boot/boot-4.0. 30 метров снипеты.
Re[9]: Генератор исходника Nemerle из C# - первая версия
От: Mumitroller Беларусь  
Дата: 08.07.11 09:29
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Новая ветка master. Это поломает клоны и форки. Не совсем конечно, но придется руками менять бранчи.


Я пока не понимаю, почему они поломаются. Может быть когда-нибудь потом разберусь.

M>>Насколько я понимаю, git специально спроектирован так, чтобы можно было контролировать абсолютно все. В том числе и произвольно переписывать историю.


Z>Переписывать можно, только ты создаешь новые бранчи при этом. Старые бранчи можно удалить. Но надо понимать, что люди которые сделали клон/форк скачали эти старые бранчаи себе. И ведут разработку от них.


Да, я это понимаю. Но переключиться на новый branch вроде достаточно просто — сделать от нужного коммита свой новый бранч и залить в него изменения из старого. Старый, при желании, можно удалить.

Mumitroller
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[9]: Генератор исходника Nemerle из C# - первая версия
От: Mumitroller Беларусь  
Дата: 08.07.11 09:38
Оценка:
Здравствуйте, Ziaw, Вы писали:

M>>А сколько стоит по размеру этот коммит в git'e? Дело в том, что размер 180М несколько напрягает при клонировании — надо иметь хороший интернет. Интересно, что там занимает столько места?


Z>Все помаленьку. Основное — бинарники boot/boot-4.0. 30 метров снипеты.


Кстати, тут подумалось — бинарники в репозитарии нужны вроде только для бутстрапинга, поэтому есть смысл хранить только последнюю версию. А все предыдущие — вычищать. Вероятно, это может существенно уменьшить размер репозитария. Правда пока несовсем понятно, как это делать.

А кому понадобятся старые бинарники — смогут найти их на ftp. Но я думаю, что вряд ли такое случится.

Mumitroller
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[10]: Генератор исходника Nemerle из C# - первая версия
От: Ziaw Россия  
Дата: 08.07.11 09:49
Оценка:
Здравствуйте, Mumitroller, Вы писали:

M>Кстати, тут подумалось — бинарники в репозитарии нужны вроде только для бутстрапинга, поэтому есть смысл хранить только последнюю версию. А все предыдущие — вычищать. Вероятно, это может существенно уменьшить размер репозитария. Правда пока несовсем понятно, как это делать.


Вычищать никак. Только переписыванием всей истории в новый бранч. Это плохое решение.

M>А кому понадобятся старые бинарники — смогут найти их на ftp. Но я думаю, что вряд ли такое случится.


Можно засунуть их в submodule, из которого в теории можно доставать только последнюю ревизию. Но это все равно геморой. И все равно потребует переделки уже опубликованного репо.
Re[9]: Генератор исходника Nemerle из C# - первая версия
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.11 20:14
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Переписывать можно, только ты создаешь новые бранчи при этом. Старые бранчи можно удалить. Но надо понимать, что люди которые сделали клон/форк скачали эти старые бранчаи себе. И ведут разработку от них.


Уверен, что еще никто ничего не форкал. Что касается клонов, разве не достаточно просто пульнуться?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Генератор исходника Nemerle из C# - первая версия
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.11 20:17
Оценка:
Здравствуйте, Mumitroller, Вы писали:

M>Кстати, тут подумалось — бинарники в репозитарии нужны вроде только для бутстрапинга, поэтому есть смысл хранить только последнюю версию. А все предыдущие — вычищать. Вероятно, это может существенно уменьшить размер репозитария. Правда пока несовсем понятно, как это делать.


Конкретная версия исходником собирается только конкретными бинарниками (бутом). Так что хранить надо все измененные буты. Иначе собрать старую версию будет невозможно.

Так что на надо химии в этом вопросе.

Если надо уменьшить объем репозитория, то нужно тупо создать новый, а старый использовать только для чтения.

200 мег конечно не мало, но и не так много чтобы напрягаться по этому поводу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Генератор исходника Nemerle из C# - первая версия
От: Ziaw Россия  
Дата: 08.07.11 20:23
Оценка:
Здравствуйте, VladD2, Вы писали:

Z>>Переписывать можно, только ты создаешь новые бранчи при этом. Старые бранчи можно удалить. Но надо понимать, что люди которые сделали клон/форк скачали эти старые бранчаи себе. И ведут разработку от них.


VD>Уверен, что еще никто ничего не форкал.


Зря уверен Пофоркали сразу, пусть свои и их можно просто попросить перефорнкуться, если правок не делали.

VD>Что касается клонов, разве не достаточно просто пульнуться?


Достаточно, только ветки будут реально разные с того момента когда пошла переписываться история. В одной будет переписанная в другой нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.