Здравствуйте, eao197, Вы писали:
E>В C++ для подобных экспериментов изобрели Boost. В .NET-е, похоже, Nemerle с макросами. E>Впечатление почему-то от исходников того и другого одинаковое
Ты ни в коем случае не бери мой код за эталон Мой код — скорее всего неправильный вариант решения проблемы, учитывая тот факт, что мой опыт писания на Nemerle практически равен нулю.
Re[16]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, VladD2, Вы писали:
VD>Так вот из этого S-выражения нужно иметь возможность вычислить тип передаваемого выражения. Причем, даже если типы не были указаны явно.
Это не всегда нужно. Например, параметром макры таки может быть строка (допустим, регулярное выражение). А разворачивается макра в код распознавателя для этого регвыра.
Когда это нужно — есть тот же самый Хиндли-Милнер, который работает и для Лиспа. Есть несколько реализаций, да и своя пишется на коленке за пол часа.
VD>Насколько мне извесно — это невозможно.
Возможно всё. Из Лиспа сделать Nemerle тривиально. Из Nemerle сделать Лисп тривиально.
Re[22]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, Oyster, Вы писали:
O>Почему же тогда, к примеру, Пол Грэхэм, один из великих евангелистов Лиспа, считает, что синтаксис таки нужен (в своих размышлениях об Arc)?
Синтаксис нужен, но не важен. Синтаксис можно какой угодно приделать. Из того же Лиспа можно в несколько строчек сделать язык с любым синтаксисом. Но делать это надо на поздних стадиях, а пока пишутся макры — писать лучше в AST. Так проще и понятней выходит.
Re[10]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, VladD2, Вы писали:
VD>Я лично не против разных парадигм вроде ФП или МП, но я против программирования в AST коим и является Лисп. В общем, я против Лиспа. Причем не навязываю свою волю никому. Если кто-то видит в Липе идильное средство разратбоки, то пусть его использует. Только без обсуждения чужих умственных способностей.
Если не в AST программировать, то многоуровневые макры становятся кошмаром.
WP>> Кто запретил приделать к Лиспу строгую типизацию? Лично мне никто не запрещал, чем и пользуюсь цинично.
VD>А зачем мне приделывать к Лиспу то и се, когда я могу просто взять язык где это уже приделано и приделано качество? Я не уверн, что смогу приделать все что мне нужно в разумные сроки. И не понимаю зачем мне этим заниматься.
Затем что язык, где прикручено много всякого разного — нишевой, узкоспециализированный язык. А метаязык, к которому можно приделать всё, из которого можно сделать любой другой язык — это универсальный язык.
Re[12]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, WinniePoh, Вы писали:
WP>> Те же макросы, что и, например, в dia2code.
VD>Нет слов. Ну, называй диаграмы хоть горшком. Мне без разницы.
Что же тут непонятного? Это — макры. Строго. И на ваши разницы тут наплевать конкретно.
VD>>>Дизайнер классов видел в VS 2005? Вот он как раз на этом самом DSL Tools сделан. Чем он на макросы похож?
WP>> Тем и похож — что каждый графический элемент (по сути — это ровно то же AST) разворачивается очень примитивным образом (подстановкой) в код.
VD>В DSL Tools вообще не определяется как ты будещь переводить модель и во чето. Есть некоторые средства, но они не обязательны. В конце концов ты волен взять генерируемый дизайнером ХМЛ и делать с ним, что хочешь.
И это тоже будет просто развёртка макр.
Re[11]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, WinniePoh, Вы писали:
WP> Синтаксис нужен, но не важен. Синтаксис можно какой угодно приделать. Из того же Лиспа можно в несколько строчек сделать язык с любым синтаксисом. Но делать это надо на поздних стадиях, а пока пишутся макры — писать лучше в AST. Так проще и понятней выходит.
Если синтаксис не важен, то почему Лисп не стал популярным?
Re[28]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, Vermicious Knid, Вы писали:
VK>Record это только для публичных полей(т.е. строго говоря для описания конструкторов структур). Accessor у меня использовать не получилось. Он его почему-то не опознает. Возможно это из-за того, что он обычно выполняется на более раннем этапе компиляции, или по другим причинам. Нужно спросить разработчиков языка.
Да, надо бы. Еще надо узанать почему при наличии твоего макроса в теле кода при любом нераспознанном идентификаторе в любой другой части кода компилятор начинает выдавать оишку говорящую, что мол класс нужно как partial обявлять. Ну, да я где-то радом об этом уже говорил.
VK>В универсальный модуль можно вынести. Есть еще пара мест где код можно упростить. Собственно местами я сделал лишнее и не заметил как можно сократить составление списка свойств. Если бы Accessor работал, то код выглядел бы так: VK>
Да, так уже значительно лучше. Но мне все же не нравится твой подход к формированию кода. Ты пыташся написать его кратче за счет впихивани максимума на еденицу полезной площади. И по-моему это не верно. Нужно делать код понянтее. Хрен бы с ним, что физически он станет больше.
Поясню о чем я говорю... Наверно проще по пунктам.
1. Формирование параметров и кода конструктора совмещено с формированием полей. Это не верный подход, так как формирование конструктора процесс универсальный (может понадобиться не в одном месте). К тому же строчка:
2. Формирование имен надо тоже выносить в библиотеки. Во-первых, это значительно более сложный процесс нежели присутствует в твоем примере. Например свойство может совпадать по имени с ключевым словом или иметь формат отличный от принятого для публичных членов в дотнете.
3. Нужно делать блее качественные проверки ошибок. Первая версия в этом плане была никакая. Вторая намного лучше. Она хотя бы не вылитит и скажет что-то разумное. Но в реальных приложениях нужна четкая диагностика. Этот варинат кода просто укажет на начало блока и скажет "Invalid metaclass syntax". Правильно было бы конечно ткнуть носом в нужное место. Темболее, что как я понимаю делатется это как-то так (то есть не сложно):
Это естественно не претензии, а так размышления в слух.
VK>А вообще-то и неупрощенный код это всего полсотни строчек. И учитывая, что он делает работу сразу трех макросов это очень хороший результат. Но насчет выноса частоиспользуемых вещей в универсальный модуль ты пожалуй прав. Я сам думал над этим неоднократно.
И все же "неупрощенный" код слишком сложен для восприятия, поддержки и слишком объемен. Конечно вряд ли на каком-то из языков программирования общего назначения (ЯПОН ) можно на сегодня написать этот код более кратно и понятно, но все же это не оправдание. Ведь XSLT-варинт продемонстрированный АВК
хотя и запусорен XSLT-конструкциями, но все же относительно краток и прост в поддержке.
Но у него есть слабое звено, он не очень то универсален и не может выдавать качественной диагностики.
Код на ЯПОН тем и хорош, что имеет больший контроль над происходящим. А Нэмерел тем, что позволяет вводить мощьные и понятные абстракции (функции/классы).
В общем, если подходить к напискнию макросов окуратно, то можетм получиться максимально краткое и весма выразительное решение.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[29]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, Oyster, Вы писали:
O>Блин... я наконец-то понял Вот как у меня получилось:
O>
O>def builder = ctx.Env.Define(<[ decl: [Record] public class $(className : name) { [Nemerle.Utility.Accessor] mutable test : int; } ]>);
O>
O>Т.е. все макросы болжны быть в куске AST, переданном в env.Define. А Record не работал потому, что при вызове env.Define у класса ещё не было полей.
O>Т.е. надо просто собрать AST заранее
Хм. Когда я эксперементировал у меня не получилось ни использовать [Record], ни даже обявить список свойств и полей как-то так:
def builder = ctx.Env.Define(<[ decl: [Record] public class $(className : name) { ..$members } ]>);
Опыта нехватило?
Попробуй, плиз, создать полную реализацию использующую атрибутные макросы.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, IT, Вы писали:
IT>>>На Лиспе можно воспроизвести синтаксис ну хотя бы C?
WP>> Можно. Пример такой методы (к сожалению там только Схема, Лиспа нет, тогда как в Лиспе гораздо более гибкий встроенный парсер С-выражений): http://dslengine.sourceforge.net/
IT>Гуд. Значит и на Nemerle можно будет. Кстати, JetBrain'овцы поднимают вопрос о гуях к DSL как об одной из самых серьёзных проблем.
Это сугубо их личное мнение, которое мало кого колышет.
IT> Так вот если её решить один раз для Nemerle (я не знаю как, не спрашивайте ),
Господи, да чего тут не знать. Тривиально. XML-ных отображений графических языков — полно. Сделать макру, разворачивающую XML в код — тривиально. Я такое для Glade и Common Lisp делал, часов 6-8 где-то потратил на всё, с отладкой и пивом.
IT> то значит она будет решена для всех построенных на нём (ней? кстати, оно какого рода?) DSL'ях.
язык — он. языки — они...
Re[11]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, Oyster, Вы писали:
WP>> Синтаксис нужен, но не важен. Синтаксис можно какой угодно приделать. Из того же Лиспа можно в несколько строчек сделать язык с любым синтаксисом. Но делать это надо на поздних стадиях, а пока пишутся макры — писать лучше в AST. Так проще и понятней выходит.
O>Если синтаксис не важен, то почему Лисп не стал популярным?
А почему Haskell с его великолепным синтаксисом не стал популярным? Почем не стал популярным ML? Почему стал популярным Perl, не смотря на ужасный синтаксис? Почему стал популярным кривой и страшный PHP? Почему не стал популярным Лисп с синтаксисом Паскаля (R-Lisp)?
Популярность от качеств технологии не зависит вообще. Популярность — это как мода, трудноанализируемая и иррациональная гадость. Серьёзным людям на популярность наплевать, а обыватели выбирают себе в популярных только тех, кого им хорошо пиарят. Так что мне просто противно когда ту или иную технологию начинают оценивать с позиций популярности. Это ведь ровно то же самое, что опустить себя на уровень серых обывателей, низших слоёв общества. Не боязно вам испачкаться, начиная такие сомнительные штудии о вкусах и предпочтениях серых масс?
Re[13]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, WinniePoh, Вы писали:
WP> А почему Haskell с его великолепным синтаксисом не стал популярным?
А мне его великолепный синтаксис не понравился почему-то.
WP>Почем не стал популярным ML?
Тут не знаю.
WP>Почему стал популярным Perl, не смотря на ужасный синтаксис?
Он был заточен под обработку строк. Собственно, в области обработки строк и начал рулить.
Кстати, не настолько уж он и популярен — наверное, даже PHP популярней.
WP>Почему стал популярным кривой и страшный PHP?
У него как раз C-подобный синтаксис
WP>Почему не стал популярным Лисп с синтаксисом Паскаля (R-Lisp)?
В первую очередь из-за слабой идеологической поддержки, наверное. Не думаю, что он сильно нравился фанатам самого Лиспа.
WP> Популярность от качеств технологии не зависит вообще. Популярность — это как мода, трудноанализируемая и иррациональная гадость.
Но ведь не появляется популярность из воздуха, правда? Хочешь, я открою тебе маленькую тайну — как правило, популярной в данной области становится технология, позволяющая решать задачи из этой области эффективнее всего. Вот и всё. Лисп такой технологией не стал, потому что не все могут ломать себе мозг. Я не могу, например, — видно, таланта не хватает.
WP>Серьёзным людям на популярность наплевать, а обыватели выбирают себе в популярных только тех, кого им хорошо пиарят.
Кто ж это такие — эти "серьёзные люди", которым наплевать? Я бы на их месте задумался, почему PHP так популярен, прежде чем начинать новый проект сайта на Perl.
WP>Так что мне просто противно когда ту или иную технологию начинают оценивать с позиций популярности.
Я не удивлён — это типичная позиция евангелиста малопопулярных языков "Наш язык — самый лучший, а на статистику мы гадили с высокой колокольни". Должен заметить, что я не считаю такую позицию самой правильной.
WP>Это ведь ровно то же самое, что опустить себя на уровень серых обывателей, низших слоёв общества. Не боязно вам испачкаться, начиная такие сомнительные штудии о вкусах и предпочтениях серых масс?
Не, мне не страшно пачкаться. Да и не буду я себя опускать на уровень этой серой массы — я и так на этом уровне И все мы на этом уровне, просто кто-то рвёт тельняжку на груди и кричит "Абсент фарева", а кто-то тихо себе пьёт более эффективную и выгодную водку.
В итоге-то мы все пишем софт для других людей — всего и делов.
Re[17]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, WinniePoh, Вы писали:
WP> Когда это нужно — есть тот же самый Хиндли-Милнер, который работает и для Лиспа. Есть несколько реализаций, да и своя пишется на коленке за пол часа.
Здравствуйте, eao197, Вы писали:
E>В C++ для подобных экспериментов изобрели Boost. В .NET-е, похоже, Nemerle с макросами. E>Впечатление почему-то от исходников того и другого одинаковое
На мой взгляд ты слишком предвзят. Увидел строчек 30 простейшего кода(из которых половину можно вынести в нормальный реюзабельный класс/функцию) и сравниваешь с бустом, где в тридцати строчках вообще ничего приличного не реализовать. В Nemerle весь компилятор, вместе со всеми стандартными макросами это всего-лишь 1.5 Mb кода, сравни с десятками мегабайт буста. Я уже не говорю о том, что этот макрос делает то, что в других языках(не будем вспоминать о Lisp) просто принципиально невозможно. И вообще boost это прикладной код. Если сравнивать Nemerle и C++ по прикладному коду, то по читабельности это как небо и земля.
Да и о чем ты говоришь, когда Oyster написал этот код буквально по исходникам компилятора, да еще только что начав изучать сам язык. Ты кстати изучал когда-нибудь исходники GCC? Ты в состоянии за пару часов набросать такое расширение синтаксиса для C++ изменив GCC? Я думаю ты возразишь, что написать макрос и поменять код компилятора это не тоже самое. Но для Nemerle это практически тоже самое, так как макросы это по сути плагины для компилятора. И расширяемость архитектуры компилятора не в последнюю очередь говорит в пользу Nemerle.
Кстати люди обычно годами осваивают C++, мне например понадобилось почти пять для того чтобы научиться свободно читать исходники буста и писать аналогичный шаблонный код. У меня кстати даже эти самые исходники буста не вызывают никакого отторжения(код там достаточно простой и понятный, просто когда пишешь что-то сложное на C++ приходится писать слишком много мусорного кода. Сложность там в первую очередь возникает из-за количества, а не качества кода), но тем не менее любой код на Nemerle в разы проще и понятнее.
Твои сравнения просто смешны. Если ты не хочешь писать макросы на/в Nemerle — не пиши их. Если ты найдешь инструмент лучше Nemerle, то используй его. Я такого инструмента не знаю. Если тебе не нравится что-то конкретное — обсуди это с разработчиками языка. Если тебе не нравится все, тогда напиши лучше. Если не можешь написать лучше или сказать что-то конструктивное, то займись чем-нибудь более полезным.
Здравствуйте, Vermicious Knid, Вы писали:
VK>Ты лучше задай пару вопросов самим разработчикам здесь. Они достаточно быстро отвечают на вопросы.
Вариант, спасибо за линк.
VK>На самом деле ты опередил меня ровно на один шаг, я сам хотел предложить такой вариант. Правда я хотел засунуть весь этот код в оберточный класс.
Согласен — конечно в реальном коде эта функциональность будет выделена.