| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Религиозные войны > Создание новых языковых конструкций |
| Автор: qweqwe 21.4.2010, 08:04 |
| Некоторые языки программирования, с помощью различных механизмов(макросов, шаблонов, правил) позволяют существенно расширять язык программирования, к примеру, вводя новые языковые конструкции. В качестве примера можно привести Nemerle, который позволяет определять макросы(в том числе и макросы, расширяющие синтаксис языка), которые обрабатываются в compile time и генерируют код. Я лично считаю, что это плохая практика, во первых, это не соответствует принципу наименьшего удивления(можно нагородить из макросов такое...), во вторых, если для решения конкретной задачи требуется расширить язык программирования, то это плохой язык программирования, либо вы что-то делаете не так |
| Автор: skyboy 21.4.2010, 11:31 |
| если макрос позволяет реализовать метапрограммирование, чего не позволяет язык сам по себе - почему бы и нет? вот можно при помощи макросов в С написать подобие шаблонов С++? Добавлено через 2 минуты и 46 секунд или я неверно понял вопрос? |
| Автор: djamshud 21.4.2010, 11:53 |
| Считаю, что хорошо. Но программист должен понимать силу, данную ему, и не злоупотреблять ею. |
| Автор: qweqwe 21.4.2010, 19:24 | ||
я когда этот пост писал, именно о Nemerle и думал, ну может еще о perl 6 хорошим примером плохого метапрограммирования может послужить C++ с библиотеками boost, например boost spirit, в общем - любые средства метапрограммирования, способные изменить язык до неузнаваемости |
| Автор: A5uKa 22.4.2010, 11:13 | ||||
| NEMERLE п.с. По поводу возможности... Конечно это плохо ! Чем меньше возможностей - тем лучше ! Выкинуть и ложки и вилки и есть руками ! >_< По поводу использования...
Именно.
А если, что бы выйти на улицу требуется одевать ботинки, то ноги что-ли плохие ? |
| Автор: kemiisto 22.4.2010, 11:41 | ||||||||
Ага. Вспомнился Forth:
Примерчик бы. Я, пожалуй, согласен. Некорректное сравнение. "Вилки и ложки" есть во всех языках. А вот нужен ли гибрид вилки, ложки, варибаси и ещё_чего_что_придёт в голову - вот в чём вопрос. Хотя, нет тут никакого вопроса...
Ботинки - это библиотека в таком контексте. Ты же предлагаешь изменять сами ноги! |
| Автор: A5uKa 22.4.2010, 11:53 | ||||
1. Я не говорю, что ты должен есть гибридной вилкой обычную еду. те "Вилки и ложки", которые есть везде не исключаются для обычной еды. Но вот например у тебя нету ТОСТЕРА ! ![]() И у тебя никогда не будет ТОСТЕРА Нужен он тебе или нет - другой вопрос , а хлеб варить будешь в микроволновке. 2. Не совсем. Когда ты одеваешь ботинки на ноги ты можешь посмотреть на них в целом как на одну вещь. Может это слишком абстрактный пример и нужно что-то другое ... ? Плохому танцору ... |
| Автор: kemiisto 22.4.2010, 12:05 | ||
Вот то-то и оно, что могу. Могу рассматривать ноги + ботинки как ноги. Ноги мне менять не надо, надо надеть ботинки. Мне не надо расширять синтаксис языка. Я могу дописать библиотеку. Может быть тогда хороший танцор соизволит показать, как он расширил синтаксис Nemerle хотя бы в одном из своих многочисленных рабочих проектов? Какие преимущества он получил? Чтоб плохим танцорам оценить. |
| Автор: A5uKa 22.4.2010, 12:21 | ||||
1. Ты сам понимаешь разницу и то, что Тостера от этого у тебя всё равно не будет. Метапрограммирование будет одевать твои ботинки за тебя, как тостер будет готовить ... 2. я не использую макросы - у меня не было надобности в подобных тостерах. но вот : http://www.rsdn.ru/article/nemerle/NemerleStingFormating.xml пример. Добавлено через 2 минуты и 6 секунд А вообще спорить с тобой дело неблагородное Ты всё равно скажешь в конце "Иди пиши свой ###код" |
| Автор: kemiisto 22.4.2010, 12:30 | ||||
Понятно. Дальше особого смысла разговаривать ТЕБЕ в этом треде я не вижу.
Итак, ещё раз повторю для хороших танцоров в танке. Я хочу, чтобы хороший танцор соизволил показать, как ОН расширил синтаксис Nemerle хотя бы в одном из своих многочисленных РАБОЧИХ проектов? Какие ПРЕИМУЩЕСТВА ОН получил? Статей от авторов языка мне не надо. Иероглифический самопиар меня мало интересует. |
| Автор: A5uKa 22.4.2010, 12:33 | ||||||
Хотеть не вредно.
|
| Автор: k0rvin 22.4.2010, 12:47 | ||||||
хотелось бы посмотреть как Вы реализуете cond таким образом.
что равносильно
только вышлядит проще и понятней |
| Автор: kemiisto 22.4.2010, 12:50 |
| k0rvin, что это было? Какой это язык? Где пример использования cond? |
| Автор: LSD 22.4.2010, 13:01 |
| Ноги обутые в ботинки это не единое целое, это ситема состоящая из 2-х слабосвязанных компонентов. Мы можем разделить ее на компоненты и они сохранят свои функциональные свойства. Мы можем скомбинировать эти ноги с другими ботинками, равно как и эти ботинки с другими ногами. А то что предлагается в первом посте, это "аллея звезд". Когда делается отпечатки конкретных ног/рук и хорошо подходят только для этих самых рук/ног. По поводу сабжа: скорее зло чем добро. Если нам нужны небольшие изменения, то и не стоит огород городить с новыми языковыми конструкциями. А если мы хотим замутить большие изменения, то тут уже будет куча последствий: - код становится трудно поддерживаемым, т.е. новый человек прежде чем начать разбираться непосредственно с системой, должен будет выучить наши надстройки над языком - грамотно разработать язык (ну или хотя бы его часть), чтобы он был логичен, "красив" и непротиворечив, задача сама по себе нетривиальная Это не значит, что задач где это нужно нет. Они есть, но их очень немного. А вот соблазн использовать микроскоп не по назначению, слишком велик. |
| Автор: A5uKa 22.4.2010, 13:03 | ||
Похоже на что-то вроде match ... Ну или switch. Если не ошибаюсь Lisp Добавлено через 1 минуту и 33 секунды зы - это и был пример ) |
| Автор: GoldFinch 22.4.2010, 13:05 |
| в fasm'е все что можно реализовано через макросы. и ничего, люди юзают и радуются. |
| Автор: A5uKa 22.4.2010, 13:26 | ||
Да вот совсем не тянет |
| Автор: LSD 22.4.2010, 14:13 |
Ты у нас вроде не единственный программист на свете |
| Автор: A5uKa 22.4.2010, 14:21 | ||
Не факт |
| Автор: k0rvin 22.4.2010, 17:05 |
| да, cond я взял из CL/Scheme, лишь более С-подобный синтаксис прикрутил =) но к match и switch оно никакого отношения не имеет, разве что чисто синтаксически похожа =) |
| Автор: qweqwe 22.4.2010, 17:26 | ||||
вот тебе статья на хабре - http://habrahabr.ru/blogs/nemerle/58801/ весьма спорное применение макросов Nemerle помимо всего прочего, макрос у них, это плагин к компилятору, а это вообще - LOL а зачем это делать, если язык прекрасно умеет pattern matching или просто поддерживает конструкцию if .. elif .. else? Добавлено через 49 секунд
я думаю здесь не много знатоков CL или Scheme, так что рассказывай, как это работает и чем полезно |
| Автор: k0rvin 22.4.2010, 18:38 | ||||
затем что паттерн-матчинг к этому никакого отношения не имеет. как Вы в паттерн засунете _произвольное_ выражение? вот if ... elif ... else ...; -- это оно, только без лишних уродских elif =) я же приводил пример выше |
| Автор: qweqwe 22.4.2010, 18:48 | ||||
да вы батенька - эстет, множить сущности ради этого кстати, сопоставление с образцом в большинстве языков позволяет делать подобное
если уж на то пошло |
| Автор: k0rvin 22.4.2010, 19:52 | ||||||||
угу, одни эстеты функции плодят, другие -- классы, третьи -- шаблоны... кругом сплошь эстеты, знаете ли =)
а вот это уже костыль... и тоже уродство, как и elif =) вместо сущностей-конструкций сущности ключевые слова, в итоге одна форма из "большинства" языков сложнее каждой из сущностей моего языка по-отдельности =) |
| Автор: A5uKa 23.4.2010, 12:58 | ||||
Добавлено через 26 секунд =_= Добавлено через 43 секунды Nemerle - кавайный язык XD |
| Автор: k0rvin 23.4.2010, 18:15 | ||||||||
CamelCase ужасен =)
|
| Автор: Logo 24.4.2010, 16:08 | ||||||
Perl 5 тоже позволяет, с помощью Devel: Скорее хорошо. Конечно, этим можно злоупотреблять - но чем вообще нельзя злоупотреблять? Например можно злоупотреблять ООП, но это не значит, что если в языке нет ООП, это хорошо. Хороший механизм расширения языковых конструкций может быть полезен при создании фреймворков/библиотек, использование этой возможности в обычном программировании - ошибка.
Это неизбежно при использовании любого крупного фреймворка/библиотеки. |
| Автор: Shaggie 26.4.2010, 07:58 |
| Макросы всего лишь очередной исключительно мощный инструмент для 1) элегантного и эффективного решения задач, 2) жестокого простреливания ног себе и всем коллегам в радиусе 30 метров. По личному опыту, макросы хороши для двух задач.
Местячковые выводы: идеально в случаях, когда систему макросов пишет многоопытный архитект, а остальные участники проекта их используют, но руками внутрь не лазят. Правда пока что видел эту красоту лишь в мечтах, но, думаю, винградовцы смогут подсказать, было ли такое на самом деле? В крайнем случае, такое же разделение ответственности применяется при работе с макросами C и шаблонами C++ - и ничего, многие команды с этим живут. Глобальные выводы: этой теме столько же лет, сколько макросам Лиспа )) не надоело переливать? |
| Автор: LSD 26.4.2010, 17:31 | ||||
Правильно фраза звучит так:
|
| Автор: JackYF 26.4.2010, 17:58 |
| Cогласен с Shaggie. Проголосовал "за". |
| Автор: Logo 26.4.2010, 21:59 | ||||||
Не вижу разницы, кем написан фреймворк. Главное как написан |
| Автор: LSD 27.4.2010, 18:24 |
И плохо, что не видишь. 1. Самописный фреймворк не известен за пределами фирмы и за пределами фирмы нет людей которые бы с ним работали. А "публичный" фреймворк известен и найти человека который бы с ним работал, вполне возможно. 2. У общедоступных фреймворков больше документации, всяких гайдов, how-to, тьюториалов, книг и т.п. У них есть сообщество пользователей где можно задать вопрос. 3. Из-за большего числа пользователей общедоступные фреймворки лучше оттестированы. 4. Для популярных фреймворков есть коммерческая поддержка и всевозможные курсы. 5. Баги фиксить и добавлять новые фичи в самописный фреймворк надо самостоятельно. А общедоступный надо просто обновлять. Поэтому любой нормальный разработчик достаточно быстро сможет разобраться в системе которая использует Spring MVC. А вот если фирма использует свой MVC, то при отсутствии людей которые этот MVC написали, может статься что разобраться в нем не получится вообще (мне известны такие случаи). |
| Автор: Logo 28.4.2010, 21:50 |
| Тогда правильнее сказать закрытый фреймфорк, или фреймворк для внутреннего пользования. |
| Автор: neutrino 28.4.2010, 23:50 |
| Я как-то дебажил эти макросы. Не дай бох никому. За небольшую практику в шесть лет программирования в шарпе не встречал необходимости в макросах. Было конечно пару раз хотелось как-то сахар послаще сделать. Но когда я думаю о дебаге макрософ мне становицца худо и начинают трястись колени. Я думаю, что способность адаптировать язык не нужно. Что надо - способность легко написать новый язык для какого-то конкретного домэйна задач. Причем сделать потом этот язык общедоступным. Хорошо бы еще продумать взаимоинтеграцию всех этих языков. Например - как в ВПФ: дезайнер рисует и не имеет понятия о программировании. Программер не имеет понятия в гуе. Каждый спец в своей области и пишет на своем языке. В итоге - шыдевр. Я более чем уверен, что за этим будущее почти любой разработки чего угодно и в т.ч. программирования. Будут языки для быстрого написания вебсайтов, для быстрого написания прог мультимедиа и т.д. Добавлено через 9 минут и 51 секунду BTW, Linq - еще один пример домэйн-ориентации языка. ИМХО тенденция верная. |
| Автор: k0rvin 29.4.2010, 07:09 | ||
o_O' Вы видимо про препроцессор Си? потому что дебажить правильные макры CL, а не "всякое препроцессорное ###", никаких проблем не доставляет =) |
| Автор: qweqwe 29.4.2010, 07:54 | ||
ну вообще, макросы CL, это скорее фича языка, чем изменение самого языка |
| Автор: A5uKa 30.4.2010, 08:08 |
| и то и другое |
| Автор: neutrino 30.4.2010, 08:55 |
А хто это такое? |
| Автор: k0rvin 30.4.2010, 12:24 | ||
http://ru.wikipedia.org/wiki/Common_Lisp |
| Автор: neutrino 30.4.2010, 14:10 |
| k0rvin, Очень похож на PL Scheme Добавлено через 6 минут и 40 секунд Ой. Оказывается это я на лиспе писал алгоритм Дийкстра Интересная тема. Язык мне понравился. Но чтобы на нем писать, надо немного "чекнуться". Как только приходит озарение правописания на лиспе начинаешь писать и получать удовольствие. Хотя я на нем не писал ничего большого. Интересно есть ли тут кто с таким опытом? |
| Автор: k0rvin 30.4.2010, 16:48 | ||
вряд ли. скорее на http://lisper.ru и [email protected] |
| Автор: neutrino 1.5.2010, 22:28 |
| k0rvin, А аватарка у тебя тоже какая-то лисповая |
| Автор: k0rvin 1.5.2010, 23:02 | ||
http://ru.wikipedia.org/wiki/Haskell впрочем хаскелл я плохо знаю, просто изображение понравилось |
| Автор: gcc 2.5.2010, 12:08 | ||
| вот например сделали http://search.cpan.org/search?query=Moose+Meta&mode=all много всего атрибуты понравились
можно увидеть какой метод с каким атрибутом в прогармме чтобы его вызвать, т.е. тут метод foo, атрибут Bar и Baz с corge еще там есть Роли как в Smalltalk (или как интерфейсы Java) |
| Автор: k0rvin 2.5.2010, 22:15 | ||||||||
зачем? покажите практическую пользу вот, допустим, есть у меня метод
узнал я его аттрибуты:
дальше-то что? что мне с ними делать, с этими аттрибутами? |
| Автор: Logo 2.5.2010, 23:41 | ||
| k0rvin Атрибуты к функциям - это такая фитча, есть в perl, насчет остальных языков не знаю. Бывает полезно, например веб-фреймворк cataslyst использует атрибуты для методов контроллера, чтобы определить, к какому урлу привязан метод. Напоминает конфиги веб сервера.
Алсо, есть несколько встроенных атрибутов. |
| Автор: k0rvin 3.5.2010, 12:55 |
| эта "фича" делается запросто в любом языке, предоставляющем возможность объявлять типы данных, содержащие функции. другое дело что удобный синтаксис искаропки =) |