Сразу скажу, ни того ни другого не знаю. Прочитал первую часть статьи "Язык Nemerle".
Сейчас читаю "Functional Programming for the real world" — F#.
Оба языка разрабатывались для .Net. Oба поддерживают и функциональное и объектное программирование.
Немерле позволяет определять собственные макросы, я это видел в статье на примере макроса &&.
В F# можно определять собственные операторы.
В чем же преимущество Nemerle перед F#?
Здравствуйте, Lloyd, Вы писали: F>>Оба языка разрабатывались для .Net. L>Это не совсем верно по отношению к F#-у — он не разрабатывался для .Net, за основу был взят OCaml.
Но ведь и Nemerle "лишь" комбинирует идеи, ранее уже существовавшие в других языках, которые появились задолго до .Net?
Да и какая разница изначально разрабатывался или потом доработали? F# позволяет создавать библиотеки, которые без проблем могут быть использованы в проекте на C#.
Здравствуйте, febus, Вы писали:
F>>>Оба языка разрабатывались для .Net. L>>Это не совсем верно по отношению к F#-у — он не разрабатывался для .Net, за основу был взят OCaml. F>Но ведь и Nemerle "лишь" комбинирует идеи, ранее уже существовавшие в других языках, которые появились задолго до .Net? F>Да и какая разница изначально разрабатывался или потом доработали?
Здравствуйте, febus, Вы писали:
F>Да и какая разница изначально разрабатывался или потом доработали? F# позволяет создавать библиотеки, которые без проблем могут быть использованы в проекте на C#.
Прозрачное взаимодействие — свойство платформы, не языка. После компиляции и Nemerle, и F# превращаются в MSIL.
Далее, ЕМНИП, операторы, созданные в F#, только в нём и получится использовать, т.к. это уже свойство языка, а не платформы. Кстати, это по сути не операторы, а обыкновенные функции с именами из специальных символов и двумя аргументами, которые разрешается применять инфиксно. Например, в Haskell (просто не знаю, как в других языках, может, тоже есть) функция двух аргументов с обычным именем тоже может быть использована инфиксно, если её имя заключить в обратные кавычки: 2 `foo` 3
Как я считаю, Nemerle мощнее F# именно в плане своей подсистемы макросов. Nemerle позволяет создавать не только новые операторы, но и новые синтаксические конструкции.
У нас в процессе работы над первым же проектом Nemerle превратился из языка общего назначения в DSL, сам собой. Просто по ходу создавались макросы для всех удачных решений и внедрялись. Этакий мета-рефакторинг. Начинаешь писать вроде-бы на C#, а заканчиваешь на чём-то своём, удобном и полностью заточенном под задачу. После такого опыта — взгляд на другие языки стал у меня очень предвзятым, так что писать про тот же F# ничего не буду — всё равно сплошные лозунги и агитки за Nemerle будут получаться
Здравствуйте, hi_octane, Вы писали:
_>У нас в процессе работы над первым же проектом Nemerle
Ух ты! Вы используете Nemerle в реальных коммерческих проектах вашей фирмы?
_>Nemerle превратился из языка общего назначения в DSL, сам собой
Насчет DSL, я так понимаю, это фишка не столько самого языка, как функциональной парадигмы в целом. F# позволяет создавать свой специализированный язык под конкретную задачу.
Как именно это делается — не знаю. Но в оглавлении книги вижу, что можно.
_>взгляд на другие языки стал у меня очень предвзятым, так что писать про тот же F# ничего не буду — всё равно сплошные лозунги и агитки за Nemerle будут получаться
Зря, — даже субъективные вещи вполне себе аргумент. Меня пока хитровывернутый синтаксис и отступы в F# напрягают. Впрочем это абсолютно естественно, т.к. я никогда раньше функционального стиля не видел. Linq не считается
Мне F# синтаксис мозг выносит: вроде смотришь в книгу, но видишь фигу. А к Немерлу я довольно быстро привык.
В теории главным преимуществом должны быть макросы.
Здравствуйте, hi_octane, Вы писали:
_>У нас в процессе работы над первым же проектом Nemerle превратился из языка общего назначения в DSL, сам собой. Просто по ходу создавались макросы для всех удачных решений и внедрялись. Этакий мета-рефакторинг. Начинаешь писать вроде-бы на C#, а заканчиваешь на чём-то своём, удобном и полностью заточенном под задачу. После такого опыта — взгляд на другие языки стал у меня очень предвзятым, так что писать про тот же F# ничего не буду — всё равно сплошные лозунги и агитки за Nemerle будут получаться
Здорово! А можете пример привести? Ну например: была такая проблема, думали как решить, остановились на макросах по таким-то причинам, решили, переделали, переделали, используем.
F>Насчет DSL, я так понимаю, это фишка не столько самого языка, как функциональной парадигмы в целом. F# позволяет создавать свой специализированный язык под конкретную задачу.
Когда в F# можно будет каким-то образом читать и менять AST компилирующейся в данный момент программы — буду смотреть. А так — в C/C++ тоже можно DSL сделать — #define и погнали
F>Здорово! А можете пример привести? Ну например: была такая проблема, думали как решить, остановились на макросах по таким-то причинам, решили, переделали, переделали, используем.
вот пример кода (здесь и далее пишу по памяти — я ща отдыхаю от трудовых подвигов).
fork(100)//поднимает потоки по числу процессоров, выполняет ими в общей сложности 100 итераций
{
def element = items[forkIndex];//получили какой-то элемент, работаем с ним
}
//здесь мы снова в главном потоке, многопоточная обработка завершена
На C# короче чем Threads.Fork((forkIndex) => { лямбда }); — не получалось. А главное — в C# за иммутабельностью расшаренного состояния следить надо было, а Nemerle это сам делает.
Или вот такой пример — к нам много данных приходило в текстовом формате. Парсить решили регекспами (данные от legacy системы, далеки от XML/HTML). Но сами регекспы сравнительно медленные, что-бы были быстрые — нужна прекомпиляция. Но прекомпилируемый регексп — уже не так удобен в использовании — его по месту использования не объявишь, он загружается из отдельной DLL, которую надо отдельно компилировать и т.п. На макросах мы получили фактически объявление по месту использования и с компилированными регекспами. И автоматом получили кэш компилированных регекспов — т.е. если по ходу работы в разных модулях проекта использовались одинаковые регекспы — два раза их код не компилировался.
Ещё макросами была сделана собственная сериализация, мемоизация, логгирование. Ну и самое наверное странное применение — это то что один из макросов был враппером для javascript'а приходящего из внешней системы. Получалась запись вида def (x, y, z) = javascript("\\server\share\file.js");
Здравствуйте, febus, Вы писали:
F>В чем же преимущество Nemerle перед F#?
Для меня, основных преимуществ два: синтакс и макросы. Синтаксическое сходство языка с C# позволяет свободно обсуждать фрагменты кода с незнакомыми с Немерле программистами. Стандартные макросы содержат много полезного функционала, вроде мемоизации функций, безопасных printf и scanf, автоматического создания аксессоров и конструкторов. Свои макросы я пишу редко, но написанные сэкономили тонны времени. Без своих макросов локализации я бы просто не стал переводить одну программу с десятками тысяч пользователей. Своя библиотека макросов профилирования очень помогает писать алгоритмы. Макросы генерируют таблицу имён в одном моём DSL'е.
Ce n'est que pour vous dire ce que je vous dis.
Re[3]: В чем преимущество Nemerle перед F#?
От:
Аноним
Дата:
30.12.09 19:12
Оценка:
Здравствуйте, febus, Вы писали:
_>>У нас в процессе работы над первым же проектом Nemerle F>Ух ты! Вы используете Nemerle в реальных коммерческих проектах вашей фирмы?
Хотел было по ёрничать по поводу столь по детски наивного удивления, но боюсь обидеть.
_>>Nemerle превратился из языка общего назначения в DSL, сам собой F>Насчет DSL, я так понимаю, это фишка не столько самого языка, как функциональной парадигмы в целом.
Можно не скромный вопрос?
Ты лично сам много DSL-лей сделал на F#-е?
F>F# позволяет создавать свой специализированный язык под конкретную задачу.
С удовольствием послушаю о замечательных свойствах F# которые позволят создавать встроенные ДСЛ-и.
Это не lex yacc ли имеются в виду? Или может CAML4P? Но он откровенно и рядом не стоял с макросами, да и не поддерживается вроде бы он в F#. Хотя я тут не уверен.
F>Как именно это делается — не знаю. Но в оглавлении книги вижу, что можно.
Сравнивать языки программирования по информации полученной из оглавления книги — это круто! Так держать!
_>>взгляд на другие языки стал у меня очень предвзятым, так что писать про тот же F# ничего не буду — всё равно сплошные лозунги и агитки за Nemerle будут получаться F>Зря, — даже субъективные вещи вполне себе аргумент. Меня пока хитровывернутый синтаксис и отступы в F# напрягают. Впрочем это абсолютно естественно, т.к. я никогда раньше функционального стиля не видел. Linq не считается
В технологиях нужно разбираться. То кто разобрался в том, что такое мета программирование не будет даже задаваться вопросом есть ли в F# его полноценная поддержка. Он и так понимает, что нет.
Здравствуйте, hi_octane, Вы писали:
_>Когда в F# можно будет каким-то образом читать и менять AST компилирующейся в данный момент программы — буду смотреть. А так — в C/C++ тоже можно DSL сделать — #define и погнали
Как раз в C++ возможностей по больше. Все же метапрограммирование на шаблонах хотя и кривое решение, но рабочее.
Справедливости ради нужно заметить, что по наследству от Окамла F# получил в свое распоряжение квази-цитировние. Но парадокс заключается в том, что с его помощью нельзя создавать код во время компиляции.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, febus, Вы писали:
F>Сразу скажу, ни того ни другого не знаю. Прочитал первую часть статьи "Язык Nemerle". F>Сейчас читаю "Functional Programming for the real world" — F#. F>Оба языка разрабатывались для .Net.
Это не так. Nemerle — это новый язык который действительно исходно разрабатывался для дотнета. По этому он бесшовно интегрируется с дотнетом (не хуже C#-а).
F# же — это адаптация функционального языка Ocaml. Идиомы Ocaml-а частенько конфликтуют с идиомами дотнета.
Можно сказать так. F# предоставляет адаптированный Ocaml поверх дотнета, а Nemerle — это язык разработанный для дотнета.
F>Oба поддерживают и функциональное и объектное программирование.
Более того, они имеют общего предка — язык ML.
Вот только реализовано все несколько по разному. F# поддерживает и ФП, и ООП почти так же как это делает Ocaml. Очень характерен, например, взгляд F# на ООП. ООП в F# и Ocaml как бы вытекает из ФП (замыканий и т.п.). Все это делает F# трудным для восприятия и изучения для тех кто до этого не был связан с миром ФП, но был знаком, скажем, с C#.
Nemerle, в отличии от F#, имеет не одного предка (OCaml), а сразу несколько предков (C#, ML, Lisp). Причем от C# Nemerle позаимствовал весьма не мало. Это позволяет C#-программистам намного проще изучать новый язык и использовать подходы хорошо изученные при работе на C#.
F>Немерле позволяет определять собственные макросы, я это видел в статье на примере макроса &&. F>В F# можно определять собственные операторы.
Немерле так же позволяет определять собственные операторы. Только это сделано способом принятым в C#.
Дело в том, что возможность определять операторы — это не основная возможность макросов (т.е. метапрограммирования). Метапрограммирование (МП) — это намного больше нежели возможность определить оператор или функцию.
МП — это возможность менять код во время компиляции. Причем не только генерировать код, но и анализировать имеющийся код. Просто надо понимать, что во водных главах приводятся очень простые реализации макросов, чтобы не перегружать неподготовленного читателя.
F>В чем же преимущество Nemerle перед F#?
В кратце:
1. Поддержка метапрограммирования. А это значит: вводить собственные конструкции языка, автоматизировать написание кода, решать задачи методом создания встроенных ДСЛ-ей (языков описывающих задачу в терминах предметной области).
2. Nemerle во многом мимикрирует под C#, что позволяет как упростить изучение Nemerle C#-программистами, так и проще использовать возможности дотнет-библиотек которые писались в рассчете на использование из C#. Можно сказать, что Nemerle — это C# на стероидах (идеальный C#).
Тут скорее будет более уместным обратный вопрос.
А в чем же преимущество F# перед Nemerle?
Если вы не являетесь знатоком Ocaml-а, то найти ответ на этот вопрос будет не просто.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, febus, Вы писали:
F>Да и какая разница изначально разрабатывался или потом доработали?
Примерно такая же как использовать для гонок специально разрабатываемый болид и доработанный самосвал. Может самосвал и хорош в своей области применения, но в условиях шоссейно-круговых гонок он явно будет чувствовать себя не в своей тарелке (как его не дорабатывай).
F>F# позволяет создавать библиотеки, которые без проблем могут быть использованы в проекте на C#.
F# обложен кучей собственных библиотек оборачивающих API дотнета, чтобы его использование выглядело более менее естественно в F#. Можно скзать, что в F# создается виртуальный ФП-мир посреди враждебного мира дотнета. Кое что из мира дотнета в F# вообще отсутствует. Как, например, в F# объявить protected-свойство или protected internl-метод?
ЗЫ
В общем, что тут разводить бодягу. Изучи оба языка и сам сможешь ответить на все вопросы. Причем теоретического знакомства мало. Нужны практические упражнения.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Мишень-сан, Вы писали:
МС>Как я считаю, Nemerle мощнее F# именно в плане своей подсистемы макросов. Nemerle позволяет создавать не только новые операторы, но и новые синтаксические конструкции.
Уточню. Не только синтаксические, но и семантические! Это, на мой взгляд, намного важнее. Переписывание синтаксиса конечно дает некоторые бенефиты, но не так можно как задание умного поведения. Макры немерла позволяют анализировать код, информацию о типах и на основании этого анализа генерировать специализированный код. Это позволяет реализовывать разную семантику для разных случаев использования. Например, макрос foreach ни чем не уступает аналогичному оператору C# и даже превосходит его. А ведь это всего лишь макрос!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Аноним, Вы писали:
F>>Ух ты! Вы используете Nemerle в реальных коммерческих проектах вашей фирмы? А>Хотел было по ёрничать по поводу столь по детски наивного удивления, но боюсь обидеть.
Да без проблем, тем более анонимно Возможность получения информации на форуме для чайника — это тоже одно из важных преимуществ языка программирования.
А удивление то как раз и не детское. Убедить собственное руководство в том, чтобы разработка велась на языке, даже о существовании которого на сегодня знают лишь немногие программисты — вот это действительно круто. Если контора ты сам, да те два парня, то это другое дело: как средство борьбы с аутсорсингом, вполне себе вариант, конечно. Как средство защиты тоже, т.к. рефлектор не поможет.
_>>>Nemerle превратился из языка общего назначения в DSL, сам собой F>>Насчет DSL, я так понимаю, это фишка не столько самого языка, как функциональной парадигмы в целом. А>Можно не скромный вопрос? А>Ты лично сам много DSL-лей сделал на F#-е?
Ни одного, я вчера его впервые открыл Впрочем, я об этом писал в вопросе. Прочитай оглавление темы
F>>F# позволяет создавать свой специализированный язык под конкретную задачу. F>>Как именно это делается — не знаю. Но в оглавлении книги вижу, что можно. А>Сравнивать языки программирования по информации полученной из оглавления книги — это круто! Так держать!
Оглавление — это уже много, см. выше
_>>>взгляд на другие языки стал у меня очень предвзятым, так что писать про тот же F# ничего не буду — всё равно сплошные лозунги и агитки за Nemerle будут получаться F>>Зря, — даже субъективные вещи вполне себе аргумент. Меня пока хитровывернутый синтаксис и отступы в F# напрягают. Впрочем это абсолютно естественно, т.к. я никогда раньше функционального стиля не видел. Linq не считается
А>В технологиях нужно разбираться. То кто разобрался в том, что такое мета программирование не будет даже задаваться вопросом есть ли в F# его полноценная поддержка. Он и так понимает, что нет.
Пойду убьюсь об стену.
Здравствуйте, febus, Вы писали:
F>А удивление то как раз и не детское. Убедить собственное руководство в том, чтобы разработка велась на языке, даже о существовании которого на сегодня знают лишь немногие программисты — вот это действительно круто. Если контора ты сам, да те два парня, то это другое дело: как средство борьбы с аутсорсингом, вполне себе вариант, конечно. Как средство защиты тоже, т.к. рефлектор не поможет.
Если человек принимающий решение уже знаком с языком, то это не проблема. Проблемы обычно возникают в больших забюракротизированных конторах. Но они и F# использовать вряд ли станут. Ява для них — самое то. Ну, на крайняк C#.
F>Ни одного, я вчера его впервые открыл Впрочем, я об этом писал в вопросе. Прочитай оглавление темы
Тогда попробуй. Тебя ждут сплошные разочарования. Для немерла — макры, а значит и метапрограммирование — это неотъемлемая часть языка. В F# же есть даже меньше чем в его родителе — Ocaml-е.
F>>>F# позволяет создавать свой специализированный язык под конкретную задачу. F>>>Как именно это делается — не знаю. Но в оглавлении книги вижу, что можно. А>>Сравнивать языки программирования по информации полученной из оглавления книги — это круто! Так держать! F>Оглавление — это уже много, см. выше
Ну, так сделай следующий шаг — прочти соответствующую главу.
А>>В технологиях нужно разбираться. То кто разобрался в том, что такое мета программирование не будет даже задаваться вопросом есть ли в F# его полноценная поддержка. Он и так понимает, что нет. F>Пойду убьюсь об стену.
От этого никому толку не будет. А вот разобраться следовало бы.
Кстати, к метапрограммированию нужно прийти. Оно должно потребоваться тебе лично без оглядки на каком языке ты пишешь. Иначе толку от этого не будет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.