Что такого замечательного в Clojure? [закрыто]

40

В последнее время я взглянул на Clojure и наткнулся на этот пост о Stackoverflow, в котором рассказывается о некоторых проектах, которые следуют лучшим рекомендациям, и в целом о хорошем коде Clojure. Я хотел разобраться с языком после прочтения некоторых основных уроков, поэтому я взглянул на некоторые "реальные" проекты.

Посмотрев на ClojureScript и Compojure (два вышеупомянутых «хороших» проекта), я просто чувствую, что Clojure - это шутка. Я не понимаю, почему кто-то выбрал бы Clojure, скажем, Ruby или Python, два языка, которые мне нравятся, и которые имеют такой чистый синтаксис, и его очень легко подобрать, тогда как Clojure использует так много скобок и символов везде, что это портит читабельность меня.

Я думаю, что Ruby и Python красивы, читаемы и элегантны. Их легко читать даже для тех, кто не знает язык наизнанку. Однако Clojure для меня непрозрачен, и я чувствую, что должен знать каждую мелочь о реализации языка, чтобы понимать любой код.

Так что, пожалуйста, просветите меня!

  • Что хорошего в Clojure?
  • Каков абсолютный минимум, который я должен знать о языке, чтобы оценить его?
марко-fiset
источник
14
I don't understand why someone would pick Clojure over say, Ruby or Python- он работает на JVM и может использовать всю библиотеку Java. ... have such a clean syntaxвозможно, функциональные языки, похожие на lisp, имеют очень чистый синтаксис и структуру, к которой большинство людей не привыкли.
22
Его имя сексуально.
программист
4
Любой подросток, живущий в подвале, может забрать Python и Ruby в течение нескольких месяцев. Если это все, что они когда-либо хотят использовать, то они никогда не выйдут из подвала. Я не говорю, что кто-то, кто профессионально занимался разработкой Python в течение многих лет, является менее смертельным по сравнению с тем, кто пишет встроенный C, но если Python и Ruby - это все, что они знают и все, что они когда-либо хотят знать, то что-то подозрительно. Кстати, после окончания учебы мне потребовалось более 6 лет, чтобы понять и оценить функциональное программирование и Лиспс. Моей первой реакцией на Схему был рывок колена.
Работа
4
«возможно, функциональные языки, похожие на lisp, имеют очень чистый синтаксис и структуру, к которой большинство людей не привыкли.»: У меня очень мало опыта работы с Lisp, и я только начал читать книгу «Practical Common Lisp». До сих пор я не встречал никаких проблем с синтаксисом; ИМХО, мифы о том, что Lisp-подобный синтаксис менее читабелен, просто FUD.
Джорджио
4
Я начал смотреть на Clojure недавно (но у меня есть опыт работы с Haskell и Scala, поэтому синтаксис не такой уж шок). Я действительно нашел это удивительно читабельным. Есть очень fewсимволы вне скобок по сравнению со многими языками, и почти нет зарезервированных слов. Причина, по которой вы находите это нечитабельным, заключается в том, что это совершенно новая парадигма, и она работает совершенно иначе, чем типичный объектно-ориентированный язык. Дайте ему немного времени и энергии.
KChaloux

Ответы:

47

Для фона вы дали, если можно перефразировать:

  1. Вы знакомы с Ruby / Python.
  2. Вы еще не видите преимуществ Clojure.
  3. Синтаксис Lisp или Clojure не ясен.

... Я думаю, что лучшим ответом является чтение книги Clojure Programming Эмерика, Карпера и Гранда. Книга содержит множество явных сравнений кода с Python, Ruby и Java, а также содержит текстовые пояснения к кодировщикам из этих языков. Лично я пришел в Clojure после создания проектов хорошего размера с Python и некоторого опыта в Lisp; чтение этой книги помогло мне начать использовать Clojure не только в сторонних проектах, но и в профессиональных целях.

Чтобы ответить на два ваших вопроса напрямую:

  1. Что хорошего в Clojure? Много ответов на этом сайте и в других местах, например, см. Https://www.quora.com/Why-would-someone-learn-Clojure
  2. Каков абсолютный минимум, который я должен знать о языке, чтобы оценить его? Я бы посоветовал узнать об основных идеях, лежащих в основе дизайна Clojure, которые сформулированы как в книгах Clojure Programming, так и в книге «Радость Clojure» , а также в выступлениях Рича Хики, особенно. Разговор Простой Сделано Легко . Как только вы знаете, что / почему вы можете начать понимать, как при чтении кода Clojure, особенно как изменить свое мышление с классов, объектов, состояния / мутации на «просто функции и данные» (функции высшего порядка, карты / наборы / последовательности, типы).

Дополнительные предложения: элегантность и мощь Lisp отчасти обусловлены его минималистским и совершенно непротиворечивым синтаксисом. Это гораздо проще оценить с помощью хорошего редактора, например, Emacs с clojure-mode и ParEdit. По мере знакомства с ним синтаксис исчезает, и вы «видите» семантику, намерения и краткие абстракции. Во-вторых, не начинайте с чтения исходного кода для ClojureScript или Compojure, это слишком много за один раз; попробуйте некоторые проблемы 4clojure.org и сравните решения с лучшими программистами. Если вы видите 4-6 других решений, неизменно кто-то будет писать действительно идиоматичное, сжатое решение в стиле FP, которое вы можете сравнить с неуклюжим, многословным и излишне сложным решением в императивном стиле.

limist
источник
20

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

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

Теперь, чтобы ответить на ваши вопросы ...

  1. Clojure - это современный диалект Lisp, который работает в JVM / CLR. Это позволяет легко использовать преимущества Lisp в существующей инфраструктуре.

  2. Важно понимать, как использовать макросы для сборки Lisp в вашем проблемном домене, чтобы оценить его использование. Я действительно понял это только после реализации среды выполнения Lisp, когда обнаружил, что большинство функций языка ядра могут быть легко реализованы в самом Lisp. Требуется проект достаточного размера, чтобы получить это.

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

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

bunglestink
источник
2
Вы смотрели на светлый стол ?
4
Ваш ответ звучит так, как будто макросы являются нормальным подходом к программированию на Лиспе, хотя на самом деле большинство проблем программирования можно решить с помощью обычных функций первого класса. Макросы предназначены в первую очередь для использования в языковом программировании (то есть для расширения языка). См. Также bookshelf.jp/texi/onlisp/onlisp_9.html
Роберт Харви
3
@RobertHarvey Я бы сказал, что если вы не пользуетесь преимуществами Маркоса, то есть множество других языков, к которым я бы обратился, которые предлагают первоклассные функции с гораздо более читаемым синтаксисом.
bunglestink
@MichaelT выглядит аккуратно. Мне нравится концепция.
DPM
3
@RobertHarvey Scala, JavaScript, C #, Python и Haskell находятся на моей голове, так как языки с функциями первого класса, которые я бы рассматривал как синтаксический синтаксис, более понятный человеку, чем Lisps.
bunglestink
10

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

Я всегда любил шепот, начиная с первых дней, и я был очень взволнован, когда обнаружил Clojure (возможно, шанс использовать лисп за пределами академических кругов наконец!). Однако, как только я начал учиться, я начал ощущать неприятное чувство, хотя я не могу точно определить, что мне не нравится. Прежде всего, я бы сказал, что программирование на Common lisp было легко и весело для меня, но у Clojure есть более крутая кривая обучения. У Клиспа была определенная красота и элегантность. Я не уверен, что получу такое же чувство от Clojure. Мне интересно, исчезнет ли это чувство, когда я получу больше опыта.

У меня есть еще одна догадка для моего таинственного легкого отвращения. Я думаю, что это может быть его большая гибкость. Например, у вас могут быть структуры, которые являются наполовину векторными и наполовину отображаемыми, и с помощью нескольких символов кода вы можете принимать их в качестве параметров, разбирать их и правильно обрабатывать. Да, он удаляет весь шаблон, но почему-то это не так. Как будто вы никогда не очень хорошо знаете правила в скобках, двоеточия, браслеты и т. Д. Действуют.

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

ДПМ
источник