Язык Nemerle. Часть 5 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.09.11 02:35
Оценка: 27 (3)
Я сейчас работаю над четвертой частью "Язык Nemerle".

Решил выложить драфт для публичного просмотра с цель собрать отзывы и пожелания.

Статья размещена на гитхабе (в личном репозитории):
https://github.com/VladD2/Nemerle-Articles

Особо интересует мнение тех кто в макросах Nemerle еще не очень силен или вообще с ними незнаком, но может более-менее сносно писать гражданский код на Nemerle.

Желательно чтобы критики:
1. Прочли предыдущие части "Язык Nemerle".
2. Имели собранную с исходников интеграцию для VS 2010, так как примеры основаны на последней версии компилятора и Интеграции.
3. Умели программировать на Nemerle.
4. Не имели глубоких знаний в области макросостроения.

Замечания можно кидать как в ответ на это сообщение, так и в github.com, в виде Issues или комента к комитам.

23.09.11 23:56: Перенесено из 'Nemerle'
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: alvas  
Дата: 04.09.11 09:41
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я сейчас работаю над четвертой частью "Язык Nemerle".


VD>Решил выложить драфт для публичного просмотра с цель собрать отзывы и пожелания.


VD>Статья размещена на гитхабе (в личном репозитории):

VD>https://github.com/VladD2/Nemerle-Articles

Скачал. Там xml + папка с картинками. Не понятно чем его читать?
http://alvas.net — Аудио-инструменты для .Net разработчиков
Re[2]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 04.09.11 10:13
Оценка: +1
Здравствуйте, alvas, Вы писали:

A>Скачал. Там xml + папка с картинками. Не понятно чем его читать?


MS Word'ом.

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[2]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.09.11 12:03
Оценка:
Здравствуйте, alvas, Вы писали:

A>Скачал. Там xml + папка с картинками. Не понятно чем его читать?


Это вордовский файл, просто в ХМЛ записан для лучшего хранения в системе контрол версий.

Нужен ворд 2003 или старше. Так же можно использовать ОпенОфис. Но он не очень качественно открывает вордовские документы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: alvas  
Дата: 04.09.11 12:42
Оценка:
Здравствуйте, VladD2, Вы писали:

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


A>>Скачал. Там xml + папка с картинками. Не понятно чем его читать?


VD>Это вордовский файл, просто в ХМЛ записан для лучшего хранения в системе контрол версий.


VD>Нужен ворд 2003 или старше. Так же можно использовать ОпенОфис. Но он не очень качественно открывает вордовские документы.


Спасибо. Разобрался.
http://alvas.net — Аудио-инструменты для .Net разработчиков
Re: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: matumba  
Дата: 04.09.11 19:25
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Решил выложить драфт для публичного просмотра с цель собрать отзывы и пожелания.


В тексте есть куча рассогласований по падежу и проблемы с запятыми.
В целом написано нормально и если эта статья планируется как вводная, то я бы ещё добавил побольше разнообразных примеров того, что могут вытворять макросы. Причём примеры по всем видам макросов — уровня выражений, сборки, типа... т.е. читатель должен не просто вдохновиться потрошением АСТ, а увидеть на примерах, какие в каждом случае могут быть интересные изменения программы.
Re: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: YF Германия  
Дата: 04.09.11 20:22
Оценка: 6 (1)
Здравствуйте, VladD2, Вы писали:

VD>4. Не имели глубоких знаний в области макросостроения.

Главная предпосылка выполнена, — глубокие знания отсутствуют

Мои комментарии я оставил в виде Word-овских комментариев прямо в тексте: здесь
Хотелось бы увидеть какой-нибудь более-менее полезный пример.(Кроме IDisposable, который еще не описан, но будет )
Я бы предложил доморощенный профайлер. Макроатрибут для сборки или класса, который изменяет все методы класса(ов) так, чтобы замерялось время выполнения метода,
считалось, сколько раз метод был вызван и суммировалoсь время по методам во внешнем HashTable, добавлялся бы из макроса.
Штука была бы полезная, — что-то проект тормозит. Добавили макроатрибут на сборку (или на несколько классов, по желанию) и выяснили в чем заключается проблема.
Потом по завершении программы можно было бы сохранять результат например во внешнем файле. Если конечно, это возможно.
Re: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: Аноним  
Дата: 04.09.11 21:51
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Статья размещена на гитхабе (в личном репозитории):

VD>https://github.com/VladD2/Nemerle-Articles

Что-то вордовский документ, да и еще с расширением .xml, порвал мне шаблон.

Нельзя такие вещи с помощью виков делать? А в формат ворда всегда можно сконвертировать.

И вообще, ворд — это как-то не по канонам СПО, не православно.
Re[2]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.09.11 22:32
Оценка:
Здравствуйте, matumba, Вы писали:

M>В тексте есть куча рассогласований по падежу и проблемы с запятыми.


На орфографию и пунктуацию обращать внимание не надо. Там куча редактирований, может еще и не то быть.

Важно общее восприятие.

M>В целом написано нормально и если эта статья планируется как вводная, то я бы ещё добавил побольше разнообразных примеров того, что могут вытворять макросы.


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

Сейчас важно что вызывает вопросы, что не понятно, чего не хватает.

M>Причём примеры по всем видам макросов — уровня выражений, сборки, типа... т.е. читатель должен не просто вдохновиться потрошением АСТ, а увидеть на примерах, какие в каждом случае могут быть интересные изменения программы.


К сожалению, привести примеры всех макросов просто не выйдет. Это займет нереально много места. Статья и сейчас уже на 10 страниц тянет. А я в ней еще хочу осветить две важных темы:
1. Работу с типами.
2. Квази-цитата.
Последних банально много типов.

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

Еще раз повторюсь, что мне важно получить фитбэк по написанному. Важны:
1. Насколько понятно написано?
2. Возникают ли вопросы? Если, да, то просьба описать конкретные места вызывающие вопросы. Пусть даже я их не касался, но читающему это интересно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.09.11 23:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>И вообще, ворд — это как-то не по канонам СПО, не православно.


Ну, и хрен с ним, с православием.

Работаю как удобнее. Писать в вики — это последнее дело. Не удобно, медленно и нужно подключение к Интернету (которое не всегда имеется).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.09.11 23:45
Оценка:
Здравствуйте, YF, Вы писали:

YF>Мои комментарии я оставил в виде Word-овских комментариев прямо в тексте: здесь


Спасибо. Погляжу.

YF>Хотелось бы увидеть какой-нибудь более-менее полезный пример.(Кроме IDisposable, который еще не описан, но будет )


IDisposable. Собственно, сам пример я тут кому-то в ответ на вопрос (написал вчерне). Ценность его (на мой взгляд) не велика, но он позволяет показать ряд приемов, что ценно.

YF>Я бы предложил доморощенный профайлер. Макроатрибут для сборки или класса, который изменяет все методы класса(ов) так, чтобы замерялось время выполнения метода, считалось, сколько раз метод был вызван и суммировалoсь время по методам во внешнем HashTable, добавлялся бы из макроса.

YF>Штука была бы полезная, — что-то проект тормозит. Добавили макроатрибут на сборку (или на несколько классов, по желанию) и выяснили в чем заключается проблема.

Такой макрос уже есть в составе стандартной библиотеки. Так что смысла его повторять я не вижу. То как добавлять код в тело метода будет показано в примере с IDisposable.

YF>Потом по завершении программы можно было бы сохранять результат например во внешнем файле. Если конечно, это возможно.


Это, конечно, возможно. Но не уверен, что именно этот пример будет хорош в целях обучения.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: matumba  
Дата: 05.09.11 08:21
Оценка:
Здравствуйте, VladD2, Вы писали:

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


VD>Сейчас важно что вызывает вопросы, что не понятно, чего не хватает.


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

M>>Причём примеры по всем видам макросов — уровня выражений, сборки, типа... т.е. читатель должен не просто вдохновиться потрошением АСТ, а увидеть на примерах, какие в каждом случае могут быть интересные изменения программы.


VD>К сожалению, привести примеры всех макросов просто не выйдет. Это займет нереально много места.


Влад, я не про подробный код и пояснения, а чисто вкратце, типа: "На стадии А можно написать макрос, вводящий новый класс Б на основе существующего класса Ц" (и буквально пара строк кода, "мясо" алгоритма).
Лучше подробнее остановиться на подобных "очевидностях", чем расписывать один мозгозакипательный макрос.

VD>Статья и сейчас уже на 10 страниц тянет. А я в ней еще хочу осветить две важных темы:

VD>1. Работу с типами.
VD>2. Квази-цитата.

Я бы не смешивал всё в одну кучу. Попробуй точно определиться с целевой аудиторией — легче будет представить уровень изложения.
Я бы сделал так: одна статья пробегается по верхушкам макросов/квазицитат и даёт в лёгкой форме небольшое howto по разработке простейшего макроса (и представление о макросах вообще). Другие статьи будут специально предназначены для каждой из тем, освещая их наиболее глубоко и точно — это уже статьи для продвинутых макрописак.

VD>Еще раз повторюсь, что мне важно получить фитбэк по написанному. Важны:

VD>1. Насколько понятно написано?
VD>2. Возникают ли вопросы? Если, да, то просьба описать конкретные места вызывающие вопросы. Пусть даже я их не касался, но читающему это интересно.

Написано-то понятно, но у тебя статья получилась как пошаговый рецепт торта для тех, кто не представляет, для чего нужна мука вообще. Т.е. дай читателю сначала увидеть картину в целом — чего можно с макросами, чего нельзя, какие вещи сложны, как вообще макросы работают в студийной экосистеме. Я бы даже эту твою статью разделил на две: общая вводная (со всеми мыслимыми _краткими_ примерами всех типов) и отдельная статья "А теперь попробуем со всей этой х*** взлететь!". (у тебя статья фактически и есть из двух половин)
Re[3]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: YF Германия  
Дата: 05.09.11 09:56
Оценка:
Здравствуйте, VladD2, Вы писали:
VD>Это, конечно, возможно. Но не уверен, что именно этот пример будет хорош в целях обучения.
Вообще, статей о макросах ты уже написал немало. Эта статья по сравнению с "Расширенным курсом макросов" не содержит новой информации. Если не брать в расчет новые плюшки, в виде Визарда для макросов и того, что она более компактна. Еще будет про UserData, — в расширенном курсе я этого не видел.
Что не освещено практически нигде или мало освещено — паттернматчинг. Есть некоторые примеры, как распознать голову и хвост списка. А вот живых примеров, как в этой статье — один пример матчинга метода, с последующим анализом атрибутов, параметров и возвращаемого значения, практически нет. Между тем, писать макросы, не овладев паттерн-матчингом нереально. Макросы полезны там, где требуется некая кодогенерация, опирающаяся на анализ компилируемого кода пользователя.
Т.е. нужно уметь:
1) разбирать код
2) создадавать/изменять код

По поводу 1)
Разбирать — Это тема Паттерн-матчинга. Живые примеры можно увидеть лишь в самом компиляторе, в каталоге macros. Или Snipptets. Освещено мало. Квазицитаты, которые можно использовать как для генерации, так и для анализа кода. Wolfhound как-то ответил на этом форуме: "Задай <[ в поиске и получишь тыщу примеров квазицитат."
Только это дикая природа — исходники, в которых есть все. Но ты же не для тех пишешь статью, кто сам может со всем по одним исходникам разобраться?
Ты сказал, что профайлер уже есть. Сам же ты, по твоим же собственным словам(искать цитату — лень), предпочитаешь писать свои макры. Но это ты. А остальные так не могут.
Как пользоваться этим профайлером непонятно. Естъ там несколько макросов, которые работают на разных стадиях. Даже как этим пользоваться — неясно. Какой уж там понимать исходники.
Аналогично АОP — есть макросы, но ими никто не пользуется. Т.е. бери исходники — и вперед... Хоть бы в начале файла написали кратко, как этим всем пользоваться. Хотя для аоп есть хотя бы тесты(они же примеры), но их еще сначала надо найти и вообще знать, что они есть.

По поводу 2)
Необходимо уметь искать существующие или создавать новые:
— классы,
— методы,
— поля,
— свойства,
-анализировать типы и в зависимости от этого генерировать тот или иной код

Если поискать на этом форуме, то можно обнаружить, что на очень многие вопросы ты ответил по многу раз. Например, если поискать usesite, то можно увидеть несколько твоих похожих ответов.
Часто отсылают к исходникам макроса DesignPatterns. Может его откоментировать прямо в коде? Это я к чему — твои ответы на форуме найти сложно. А вот в каталоге исходников — они как на ладони. Хорошо бы если бы была статья или раздел статьи, по принципу "how to?" Хорошо, если бы со ссылками на исходники, где это уже применяется.
— как создать новый класс?
— как выбрать все классы, в сборке?
— как получить все методы класса?
— как получить все <х> удовлетворяющие критерию у
— как добавить базовый класс и реализовать его методы
Я понимаю, что это требует много времени и сил, которых у тебя нет.
Примеры уже написаны — они в исходниках компилятора, в каталоге macros, snippets. Осталось бы научиться в них ориентироваться.
Вот я и предложил в другой теме, записывать короткие репортажи из серии: "шо делает вот эта квазицитата".
Включил запись на 3 минуты, рассказал водя мышкой в студии, выложил на youtube, на канал Nemerle.
Не надо снимать фильмы на 4 часа.
Re[4]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 05.09.11 10:01
Оценка:
Здравствуйте, matumba, Вы писали:

M>Кстати, а есть ли готовый бинарник интеграции, чтобы самому не пересобирать?


[VS2010] Инсталлер. Просьба потестить сборку и установку
Автор: kochetkov.vladimir
Дата: 01.09.11

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: YF Германия  
Дата: 05.09.11 11:37
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я сейчас работаю над четвертой частью "Язык Nemerle".

VD>Решил выложить драфт для публичного просмотра с цель собрать отзывы и пожелания.

Еще было бы здорово, если бы были домашние задания. Или, назовем это "задания для самопроверки".
Это дает возможность проверить, что ты на самом деле понял. А то так вроде все понятно, а как начнешь делать — полная ж...
Например:
"Напишите макрос, rotate, принимающий на входе x, y, angle, и возвращающий точку, повернутую на заданное количество градусов. Если х и у константы, то макрос должен генерировать только константное значение. "
Это из англоязычного туториала по макросам. Только там дано явно недостаточно информации, для решения этого задания.

А что если макрос принимает переменное количество параметров.
А что если приходит только струкутра/класс с полями x и у?
Если интерфейс? и т.д.

Задача казалось бы простая, — сколько человек сможет ее здесь решить?
Re[4]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.09.11 14:23
Оценка:
Здравствуйте, matumba, Вы писали:

M>К сожалению, прочитал только в виде текста, в студии не упражнялся. Кстати, а есть ли готовый бинарник интеграции, чтобы самому не пересобирать? В тексте упоминается про какие-то нововведения...


Тут совсем недавно Владимир Кочетков создавал тему с просьбой потестировать новые инсталляторы. Они не самой последней версии, но для запуска примеров статьи годятся.

M>Влад, я не про подробный код и пояснения, а чисто вкратце, типа: "На стадии А можно написать макрос, вводящий новый класс Б на основе существующего класса Ц" (и буквально пара строк кода, "мясо" алгоритма).

M>Лучше подробнее остановиться на подобных "очевидностях", чем расписывать один мозгозакипательный макрос.

У меня план такой. Я даю довольно сложный (в смысле насыщенный деталями) пример макроса Disposable. В нем я на практике показываю довольно много разных техник. При этом это будет, что называется, настоящий "жизненный" пример.

Далее я в режиме мануала прохожусь по разным видам квази-цитат и показываю как с их помощью распознавать и генерировать AST.

M>Я бы не смешивал всё в одну кучу. Попробуй точно определиться с целевой аудиторией — легче будет представить уровень изложения.


Моя цель создать максимально краткий, но дающий общее понимание и реальные навыки обзор макросов. Так чтобы прочтя его человек мог бы начать писать свой, не тривиальный, макрос.

M>Я бы сделал так: одна статья пробегается по верхушкам макросов/квазицитат и даёт в лёгкой форме небольшое howto по разработке простейшего макроса (и представление о макросах вообще). Другие статьи будут специально предназначены для каждой из тем, освещая их наиболее глубоко и точно — это уже статьи для продвинутых макрописак.


Тут есть одна проблема. Макросы хорошо разбираются только на практике. Да материал для продвинутых уже есть. Только толку с него 0. В данной работе я пытался охватить те вещи которые меня за последнее время спрашивали. То есть, вещи вызывающие реальный интерес у тех кто осваивает макросы.

VD>>Еще раз повторюсь, что мне важно получить фитбэк по написанному. Важны:

VD>>1. Насколько понятно написано?
VD>>2. Возникают ли вопросы? Если, да, то просьба описать конкретные места вызывающие вопросы. Пусть даже я их не касался, но читающему это интересно.

M>Написано-то понятно, но у тебя статья получилась как пошаговый рецепт торта для тех, кто не представляет, для чего нужна мука вообще. Т.е. дай читателю сначала увидеть картину в целом — чего можно с макросами, чего нельзя,


Ну, примерно это я и пытаюсь сделать. Пример Disposable как раз будет демонстрировать что и как можно сделать с помощью макросов.

M>какие вещи сложны, как вообще макросы работают в студийной экосистеме.


Это только на практике можно понять. Но вводные я постараюсь дать.

M> Я бы даже эту твою статью разделил на две: общая вводная (со всеми мыслимыми _краткими_ примерами всех типов) и отдельная статья "А теперь попробуем со всей этой х*** взлететь!". (у тебя статья фактически и есть из двух половин)


Посмотрю, что в итоге выйдет. Сначала реализую задуманное. А там буду думать делить или не делить.

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

Плюс по макросам есть или очень поверхностные туториалы или продвинутый курс. А вот среднего звена нет. Вот его и хочется создать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.09.11 14:50
Оценка:
Здравствуйте, YF, Вы писали:

YF>Вообще, статей о макросах ты уже написал немало. Эта статья по сравнению с "Расширенным курсом макросов" не содержит новой информации.


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

YF>Если не брать в расчет новые плюшки, в виде Визарда для макросов и того, что она более компактна. Еще будет про UserData, — в расширенном курсе я этого не видел.


Моя задача не описать плюшки, а показать что надо делать чтобы создать полезный макрос. За одно стараюсь осветить нетривиальные вопросы которые поднимались на форумах за последнее вермя.

YF>Что не освещено практически нигде или мало освещено — паттернматчинг.


Он тоже будет. Только не сам ПМ (его нужно изучать по предыдущим частям). Речь пойдет о квази-цитатах в ПМ. Как и создании кода с помощью квази-цитат.

YF>Есть некоторые примеры, как распознать голову и хвост списка.


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

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


Ну, вот эта статья и призвана устранить этот пробел. В ней будет как "пример из реального мира" (Disposable), так и отдельный раздел посвященный квази-цитированию, где будут освещены разные типы цитат.

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


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

YF>Т.е. нужно уметь:

YF>1) разбирать код
YF>2) создадавать/изменять код

YF>По поводу 1)

YF>Разбирать — Это тема Паттерн-матчинга. Живые примеры можно увидеть лишь в самом компиляторе, в каталоге macros. Или Snipptets. Освещено мало. Квазицитаты, которые можно использовать как для генерации, так и для анализа кода. Wolfhound как-то ответил на этом форуме: "Задай <[ в поиске и получишь тыщу примеров квазицитат."
YF>Только это дикая природа — исходники, в которых есть все. Но ты же не для тех пишешь статью, кто сам может со всем по одним исходникам разобраться?

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

YF>Ты сказал, что профайлер уже есть. Сам же ты, по твоим же собственным словам(искать цитату — лень), предпочитаешь писать свои макры. Но это ты. А остальные так не могут.


Профайлер есть: http://nemerle.org/wiki/Profiling_macros

Пример Disposable интереснее него, так как позволяет показать больше особенностей написания реальных макросов.

YF>Как пользоваться этим профайлером непонятно.


А описание почитать трудно?

YF>Аналогично АОP — есть макросы, но ими никто не пользуется. Т.е. бери исходники — и вперед... Хоть бы в начале файла написали кратко, как этим всем пользоваться. Хотя для аоп есть хотя бы тесты(они же примеры), но их еще сначала надо найти и вообще знать, что они есть.


Ну, с АОP отдельная история. Проблема в том, что сам АОP особо никому не нужен. Те кто им заболевают и приходят в итоге к Nemerle, очень быстро понимаю, что АОP очень ограничен в возможностях, а вот сами макросы, напротив, очень гибки и мощны. АОP не конечная задача — это средство. Макросы тоже средство. Так зачем использовать какое-то ограниченное промежуточное средство, когда есть более мощное?

YF>По поводу 2)

YF>Необходимо уметь искать существующие или создавать новые:
YF>- классы,

Поиск классов уже показан в примере макросов ProjectInfo и ProjectTypeInfo. Возможно покажу потом более умные методы поиска нежели тупой перебор.

YF>- методы,


Это будет в примере Disposable.

YF>- поля,

YF>- свойства,

Думаю, что их поиск мало чем отличается от поиска методов. Член он и в Африке член .

YF>-анализировать типы и в зависимости от этого генерировать тот или иной код


Это будет в примере Disposable.

Остается только генерация типов. Тут нужно подумать как быть.

YF>Если поискать на этом форуме, то можно обнаружить, что на очень многие вопросы ты ответил по многу раз. Например, если поискать usesite, то можно увидеть несколько твоих похожих ответов.


Ну, вот про usesite и вообще цвета нужно не забыть упомянуть.

YF>- как создать новый класс?


Мы повторяемся. Как я уже сказал, это надо осветить.

YF>- как выбрать все классы, в сборке?

YF>- как получить все методы класса?

Опять повторяемся. Освещено в макросах ProjectInfo и ProjectTypeInfo.

YF>- как получить все <х> удовлетворяющие критерию у


Вообще не ясно о чем речь. Слишком абстрактно.

YF>- как добавить базовый класс и реализовать его методы


Будет в примере Disposable. Не класс, а интерфейс, но не велика разница.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.09.11 18:39
Оценка:
Здравствуйте, VladD2, Вы писали:

Добавил в каталог статьи пример кода.
Nemerle-Articles\Nemerle-macros-intro\Projects\MacroIntro
В него поместил реализацию макроса Disposable и тест к нему.

Просьба, глянуть этот пример и:
1) сказать насколько такой пример интересен;
2) указать места данного примера, которые (по вашему мнению) требуют особо тщательного описания.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: para  
Дата: 05.09.11 19:28
Оценка:
Здравствуйте, VladD2, Вы писали:

disposable

строка 64
                  base.Dispose(disposing);
                _disposed = true;

_disposed объявлен как приватный, по этому будет достаточно вызова родительского

строки 18б 23 &mdash; лишние запятые

по смыслу:
почему ImplementDisposeFields сделан отдельным макросом — так удобнее или для примера?
Re[3]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.09.11 20:54
Оценка:
Здравствуйте, para, Вы писали:

P>строка 64

P>
P>                  base.Dispose(disposing);
P>                _disposed = true;
P>

P>_disposed объявлен как приватный, по этому будет достаточно вызова родительского

Ну, и что что приватный? После выполнения Dispose состояние объекта должно считаться некорректным и он не должен позволять вызывать свои метода.
Кстати, надо будет расширить макру, чтобы она добавляла ко всем методам:
when (_disposed)
  throw ObjectDisposedException("Resource was disposed.");


P>по смыслу:

P>почему ImplementDisposeFields сделан отдельным макросом — так удобнее или для примера?

И то, и другое. ImplementDisposeFields удобнее реализовать на фазе WithTypedMembers. Об этом будет сказано в объяснении.
Ну, и все это показывает ряд приемов. Тут тебе и передача управления в другой макрос путем генерации АСТ этого макроса. И демонстрация того, что макросы из одной сборке таки могут друг к другу обращаться, пусть и не явно. И то, что генерацию чего-то что требует информации о типах нужно выносить в макросы работающие на фазе WithTypedMembers.

В общем, хороший пример демонстрирующий сразу ряд концепций и приемов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Добавил описания примера Disposable
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.09.11 00:15
Оценка:
Добавил описания примера Disposable. Просьба покритиковать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.09.11 14:43
Оценка:
Здравствуйте, YF, Вы писали:

YF>Мои комментарии я оставил в виде Word-овских комментариев прямо в тексте: здесь


Я учел твои замечания и написал раздел по примеру Disposable. Глянь, плиз.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: Маслаков Михаил Эстония www.ammyui.com
Дата: 07.09.11 15:01
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Замечания можно кидать как в ответ на это сообщение, так и в github.com, в виде Issues или комента к комитам.


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

Кстати, я тут подумал, может есть смысл сделать чат room на http://chat.stackoverflow.com/, новички могли бы там задавать простые вопросы, чтобы не заводить каждый раз тему. У этого подхода, есть, конечно, и минус — ответы не сохранятся как здесь, на форуме. Но зато будет какое-никакое живое общение, что на текущем этапе может помочь привлечению новых разработчиков.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[2]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.09.11 15:14
Оценка: +1
Здравствуйте, Маслаков Михаил, Вы писали:

ММ>Мне кажется, надо побольше реальных примеров привести. Можно, например, более или менее сложные макросы из стандартной библиотеки и пошагово объяснить как они работают.

ММ>Я прочитал несколько статей по макросам, но так и не понял как работает интеллисенс в linq <# #>. Ну и вообще, таких недопониманий у меня много, так как тема обширная.

Я (вчера) добавил в статью раздел посвященный реальному примеру — макрос Disposable (автоматизация реализации паттерна IDisposable).

Погляди, плиз, насколько понятно и полезно.

ММ>Кстати, я тут подумал, может есть смысл сделать чат room на http://chat.stackoverflow.com/, новички могли бы там задавать простые вопросы, чтобы не заводить каждый раз тему. У этого подхода, есть, конечно, и минус — ответы не сохранятся как здесь, на форуме. Но зато будет какое-никакое живое общение, что на текущем этапе может помочь привлечению новых разработчиков.


Боюсь, что чат мы не потянем. Слишком много времени нужно на него. Плюс информация будет теряться. Лучше уж просто отвечать на том же stackoverflow и здесь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: Rival Таиланд
Дата: 07.09.11 18:03
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Боюсь, что чат мы не потянем. Слишком много времени нужно на него. Плюс информация будет теряться. Лучше уж просто отвечать на том же stackoverflow и здесь.


А ещё там для того, чтобы войти в чат нужен рейтинг.
Сразу уменьшит выборку вопрощающих.
«История жизни – это, по существу, развитие сознания, которое завуалировано морфологией.» Пьер Тейяр де Шарден
Re[3]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: Маслаков Михаил Эстония www.ammyui.com
Дата: 08.09.11 11:34
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я (вчера) добавил в статью раздел посвященный реальному примеру — макрос Disposable (автоматизация реализации паттерна IDisposable).


Отличная статья, многое расставилось, наконец, по полочкам. Спасибо!
Понимаю, что написание статей, это не самое интересное занятие, но хотелось бы ещё парочку так-же подробно расписанных примеров. Меня, в частности, сейчас интересует написание более или менее сложных DSL с поддержкой IntelliSense с помощью PEG. А то я начал было писать один макрос, и быстро понял, что слишком много пробелов в знаниях, чтобы довести дело до конца.

VD>Боюсь, что чат мы не потянем. Слишком много времени нужно на него. Плюс информация будет теряться. Лучше уж просто отвечать на том же stackoverflow и здесь.


Ну чат, он не для того, чтобы 24часовой суппорт предоставлять. Понятное дело, что нет возможности сидеть и ждать вопросов от начинающих. Но если там наберётся некоторая критическая масса пользователей, то новички смогут помогать новичкам без вмешательства старожилов. А интересные вопросы можно "насильно" вытаскивать в StackOverflow, чтобы это дело индексировалось.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[4]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.09.11 13:52
Оценка:
Здравствуйте, Маслаков Михаил, Вы писали:

ММ>Понимаю, что написание статей, это не самое интересное занятие, но хотелось бы ещё парочку так-же подробно расписанных примеров. Меня, в частности, сейчас интересует написание более или менее сложных DSL с поддержкой IntelliSense с помощью PEG. А то я начал было писать один макрос, и быстро понял, что слишком много пробелов в знаниях, чтобы довести дело до конца.


Дык а форумы то на что? Все случаев все равно рассмотреть нельзя. Опыт тоже не приходит сразу. Нужно браться за нетривиальные вещи и задавать вопросы, если что-то не понятно.

Так же нужно читать форум, чтобы на чужих вопросах изучать различен тонкости.

Еще можно пытаться отвечать на чужие вопросы.

Только так можно получить то что называется опытом. Иначе можно за многое браться, но ничего толком так и не освоить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.09.11 14:41
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Статья размещена на гитхабе (в личном репозитории):

VD>https://github.com/VladD2/Nemerle-Articles

Как это открыть в ворде или эксплорере что бы прочесть ?

VD>Особо интересует мнение тех кто в макросах Nemerle еще не очень силен или вообще с ними незнаком, но может более-менее сносно писать гражданский код на Nemerle.


VD>Желательно чтобы критики:

VD>1. Прочли предыдущие части "Язык Nemerle".
VD>2. Имели собранную с исходников интеграцию для VS 2010, так как примеры основаны на последней версии компилятора и Интеграции.

А почему не то что в релизном инсталере ? Читателям тоже надо будет собирать исходники ?

VD>3. Умели программировать на Nemerle.

VD>4. Не имели глубоких знаний в области макросостроения.

Я бы прочёл, но см выше
Re[2]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: _nn_ www.nemerleweb.com
Дата: 08.09.11 14:57
Оценка:
Здравствуйте, Ikemefula, Вы писали:

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


VD>>Статья размещена на гитхабе (в личном репозитории):

VD>>https://github.com/VladD2/Nemerle-Articles

I>Как это открыть в ворде или эксплорере что бы прочесть ?


http://rsdn.ru/forum/nemerle/4406992.1.aspx
Автор: VladD2
Дата: 04.09.11


Просто открыть файл XML Word-ом.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: YF Германия  
Дата: 08.09.11 14:58
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>А почему не то что в релизном инсталере ? Читателям тоже надо будет собирать исходники ?

Т.к. используются вещи, недостуные в зарелизенной версии.

I>Как это открыть в ворде или эксплорере что бы прочесть ?

I>Я бы прочёл, но см выше

Если бы ты прочел ветку, то увидел бы второе сообщение alvas и ответ на него.
Word-oм 2003 и старше это читается. Кстати, рекомендую, эта статья читабельнее всех предыдущих по макросам.
Re[2]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.09.11 17:23
Оценка:
Здравствуйте, Ikemefula, Вы писали:

VD>>Статья размещена на гитхабе (в личном репозитории):

VD>>https://github.com/VladD2/Nemerle-Articles

I>Как это открыть в ворде или эксплорере что бы прочесть ?


1. Скачать локально. Это можно сделать через гит (если есть гитхабовский эканут) или скачать в виде зипа (огромная кнопка Download по приведенной ссылке).
2. Найти файл Nemerle-macros-intro\Nemerle-macros-intro.xml
3. Нажать Enter

I>А почему не то что в релизном инсталере ?


Потому что описываются и используются новые возможности.

I>Читателям тоже надо будет собирать исходники ?


Можно взять инсталлятор отсюда
Автор: kochetkov.vladimir
Дата: 01.09.11
. Но лучше с исходников.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.09.11 08:49
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>1. Скачать локально. Это можно сделать через гит (если есть гитхабовский эканут) или скачать в виде зипа (огромная кнопка Download по приведенной ссылке).

VD>2. Найти файл Nemerle-macros-intro\Nemerle-macros-intro.xml
VD>3. Нажать Enter

Я на форум написал _после_ того как проделал всё это

Всем спасибо, вопрос решился.
Re[3]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: YF Германия  
Дата: 09.09.11 15:19
Оценка:
Здравствуйте, VladD2, Вы писали:
VD>Я учел твои замечания и написал раздел по примеру Disposable. Глянь, плиз.

Да, я видел, еще до того, как ты мне отписал. Было приятно быть услышанным.
Я там еще наделал комментариев.
Может быть, хотя бы некоторые из них окажутся полезными:
здесь
Re[4]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.09.11 15:24
Оценка:
Здравствуйте, YF, Вы писали:

YF>Я там еще наделал комментариев.

YF>Может быть, хотя бы некоторые из них окажутся полезными:
YF>здесь

Спасибо. Сейчас гляну.

ЗЫ

Есть замечательный сайт — http://www.translit.ru. Там можно писать транслитом и моментально конвертить текст в русский.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.09.11 19:54
Оценка:
Здравствуйте, YF, Вы писали:

YF>Может быть, хотя бы некоторые из них окажутся полезными:

YF>здесь

Внес и это. Только тут слишком много было замечаний вызванных тем, что ты немного недочитал до места где было объяснение. В статье стиль такой. Сначала предмет обсуждение, а затем уже само обсуждение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: YF Германия  
Дата: 12.09.11 14:29
Оценка:
Здравствуйте, VladD2, Вы писали:

Попытался изменить в файле Disposable_BeforeTypedMembers.n генерацию disposeImple, чтобы избежать дублирования.

      def methodHeader = match (needOverride) 
      {
          | true => <[ decl: protected override Dispose(disposing : bool) : void ]>;
          | _    => <[ decl: protected virtual Dispose(disposing : bool) : void ]>;
      }
      def baseMethodCall = if (needOverride) <[base.Dispose(disposing);]> else <[ () ]>;
      def disposeImple = 
      <[ decl:
            $methodHeader
            {
              unless (_disposed)
              {
                when (disposing)
                {
                  // Генерируем вызовы Dispose для IDisposable-полей.
                  $(disposeIDisposableFields : name)();
                  // Вставояем код очистки управляемых ресурсов предосталяемый пользователем.
                  $disposeManaged;
                }
                // Вставляем код очистки неуправляемых ресурсов предосталяемый пользователем.
                $disposeUnmanaged;
                // TODO: Обнуляем все изменяемые поля.
                  $baseMethodCall;
                _disposed = true;
              }
            } ]>;


Не получается.
Просто хочется увидеть, как можно собрать метод "по кусочкам", из нескольких PExpr, если это возможно.
Что я не так делаю?
Re[2]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.09.11 14:41
Оценка: 4 (1)
Здравствуйте, YF, Вы писали:

YF>Попытался изменить в файле Disposable_BeforeTypedMembers.n генерацию disposeImple, чтобы избежать дублирования.


Это просто некорректный код:
YF>      <[ decl:
YF>            $methodHeader


Задавать через цитату нужно только атрибуты и модификаторы. Покажу как это делать в статье (это не самая простая тема).
Сам же метод (его заголовок) надо описывать как обычно.

А это правильный:
YF>      def baseMethodCall = if (needOverride) <[base.Dispose(disposing);]> else <[ () ]>;
YF>...
YF>                // Вставляем код очистки неуправляемых ресурсов предосталяемый пользователем.
YF>                $disposeUnmanaged;
YF>                // TODO: Обнуляем все изменяемые поля.
YF>                  $baseMethodCall;
YF>                _disposed = true;


YF>Не получается.

YF>Просто хочется увидеть, как можно собрать метод "по кусочкам", из нескольких PExpr, если это возможно.

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

YF>Что я не так делаю?


Первая цитата в корне не верна. Там нельзя. Надо как-то так:
...
def attrs = Modifiers(NemerleAttributs.Protected 
              | if (needOverride) NemerleAttributs.Override
                else              NemerleAttributs.Virtual, []);
                 
def disposeImple =
  <[ decl:
    protected ..$attrs Dispose(disposing : bool) : void
    ...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.09.11 22:10
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я сейчас работаю над четвертой частью "Язык Nemerle".


Закончил черновой вариант. Просьба всех кто может поглядеть.

Отдельное замечание на счет примеров. Примеры в конченой версии проектов не соответствуют примерам описываемым в середине статьи. Чтобы получать их в виде соответствующем описанию нужно брать более старые версии. Позже я сделаю список ссылок на нужные версии и добавлю их в текст статьи, чтобы можно было экспериментировать с проектами в исходном виде.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: artelk  
Дата: 23.09.11 10:43
Оценка:
Здравствуйте, VladD2, Вы писали:

[Record]
[Disposable]
class Derived : Base
{
  private FileStream : FileStream;
  private Str        : string;
  public Reader      : TextReader { get; private set; }
}

...Обратите внимание, что к полю _disposed добавлен атрибут RecordIgnore. Это макроатрибут из стандартной библиотеки. Он подавляет генерацию параметра для поля, при использовании макроатрибута Record (автоматически формирующего конструктор для всех полей типа)...


1. Гарантируется ли у макроатрибутов порядок их применения? Т.е. если убрать [RecordIgnore] у _disposed и поменять местами [Record] и [Disposable], параметр конструктора генерироваться не будет, так?
2. Имхо, такие неявные зависимости нужно как-то разрулить — декларировать их явно.

Мысли на этот счет:
1. Можно сделать, чтобы из маркоса можно было бы выяснить, кто поле\метод\свойство создал.
2. Можно скрывать от макроса поля\методы\свойства, сгенерированные другими макросами, если их видимость явно не задекларирована. Например, [A][B] — независимое применение макроатрибутов; [A,B] последовательное применение, причем B видит результаты A.
3. Можно при определении макроса перечислить ему все макросы, о которых он "знает", чтобы иметь доступ к сгенерированному ими коду.
Re[2]: Язык Nemerle. Часть 4 - Макросы Nemerle (preview)
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.09.11 14:48
Оценка:
Здравствуйте, artelk, Вы писали:

A>1. Гарантируется ли у макроатрибутов порядок их применения? Т.е. если убрать [RecordIgnore] у _disposed и поменять местами [Record] и [Disposable], параметр конструктора генерироваться не будет, так?


Нет, не гарантируется. По жизни макросы обрабатываются в том порядке в котором они переменены. Однако если макросы применены к разным типам (членам и т.п.), то порядок их выполнения может быть любой.

Но есть три стадии макросов. RecordIgnore отрабатывает на самой ранней стадии — BeforeInheritance. Если макрос более ранней стадии добавляется макросом более поздней стадии, то при вызове typeBuilder.Define() такие макросы будут незамедлительно вызваны.

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

A>2. Имхо, такие неявные зависимости нужно как-то разрулить — декларировать их явно.


Да. Было бы не плохо. Но в Nemerle 1.x это не сделано. В 2.х сделаем.

A>Мысли на этот счет:

A>1. Можно сделать, чтобы из маркоса можно было бы выяснить, кто поле\метод\свойство создал.

Зачем?
Понять что поле добавлено с помощью квази-цитаты в принципе можно. У них в свойстве Location выставлен флаг IsGenerated.
Вот только иногда удобно чтобы макросы видели поля созданные другими макросами.
Для передачи информации лучше использовать атрибуты и макро-атрибуты (как показано в примере).

A>2. Можно скрывать от макроса поля\методы\свойства, сгенерированные другими макросами, если их видимость явно не задекларирована. Например, [A][B] — независимое применение макроатрибутов; [A,B] последовательное применение, причем B видит результаты A.


Это как-то очень сложно.

A>3. Можно при определении макроса перечислить ему все макросы, о которых он "знает", чтобы иметь доступ к сгенерированному ими коду.


Тема зависимости между макросами — это довольно сложная тема. Мы думали на эту тему, но решили нечего не менять в Nemerle 1.x. В 2.х мы постараемся проработать эту тему по серьезнее.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.