Синтаксис Clojure действительно проще, чем у Scala?

Аргумент, который всегда делается в пользу Clojure, таков.

Синтаксис проще, и есть только один способ выражения кода без сложных правил.

Однако Scala имеет множество различных типов синтаксиса и конструкций по сравнению с Clojure.

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

Итак, в каком смысле синтаксис Clojure проще? Для LISPers это может быть, но для людей с другого фона изучение различных конструкций в Scala кажется более простым.

Итак, с нейтральной точки зрения, какой синтаксис проще и читабельнее?

8
Если вы посмотрите в стандарте Scala, его грамматика составляет 7 страниц. насколько мне нравится Scala, у него нет более простого синтаксиса, чем lisp.
добавлено автор jozefg, источник

5 ответы

Итак, с нейтральной точки зрения, какой синтаксис проще и читабельнее?

Это два вопроса very .

Simpler means "composed of fewer parts". Clojure's syntax has fewer rules, ergo it is objectively simpler than Scala's.

Readability, however, is subjective. It mainly comes down to familiarity. For example, I find ECMAScript, C#, Java, D, Go, C++ and C to be nearly incomprehensible, but for someone who is used to reading that kind of syntax, they are fairly readable. This part of the question cannot be answered objectively or "from a neutral point of view".

18
добавлено
Да, но вопрос был о синтаксисе, а не семантике. Если это то, что вы хотите знать, вы должны уточнить свой вопрос.
добавлено автор Lawrence B. Crowell, источник
+1: Это хороший ответ на вопрос OP. Интересно, однако, что идея, что читаемость является полностью субъективной, является распространенным мифом. Логично предположить, что, учитывая аналогичный опыт двух разных языков, один язык может быть более читабельным, чем другой, по крайней мере статистически. (Рассмотрим, например, те эзотерические языки, которые очень нечитабельные , даже если вы их хорошо знаете). К сожалению, я не знаю никаких исследований по этому вопросу.
добавлено автор Eric H, источник
+1: «Читаемость, однако, субъективна. В основном это сводится к знакомству». Правда. Я играл с Scheme и Common Lisp в последнее время (я не эксперт ни в одном из них), и я не понимаю, почему их синтаксис считается трудным для чтения: к нему очень легко привыкнуть.
добавлено автор Giorgio, источник
@Kramii: У меня многолетний опыт работы с C ++ и несколько месяцев опыта работы с Common Lisp, и я нахожу CL намного более читаемым, чем C ++. Это либо показывает, что Common Lisp объективно гораздо читабельнее, чем C ++, или что мой способ рассуждения ближе к тому, как работает CL. Или, может быть, это просто ничего не доказывает.
добавлено автор Giorgio, источник
синтаксис имеет меньшее количество правил, но опять-таки кривая обучения остается той же, что и вы должны изучать разные макросы, так как вам нужно изучать разные конструкции. Даже если они записаны с символом символов.
добавлено автор Amogh Talpallikar, источник
@Kramii: Вы имели в виду языки, такие как BrainFuck?
добавлено автор Amogh Talpallikar, источник

Когда я работаю в Scala, часто происходит фаза моего развития (особенно с помощью для ), где я должен правильно разработать все типы, что является большим плюсом для больших проектов, но определенная отрицательный для малых. Я ожидал, что могу просто забыть типы и сосредоточиться на «выполнении работы» в Clojure, как я смутно помню, что делал в Perl или Awk, но пока это не получилось для меня. Мой опыт заключается в том, что вместо того, чтобы «делать типы работы» на этапе кода/компиляции, я получаю исключения, когда пытаюсь запустить свой код. Это не упрощение; проблема не исчезла, она просто перешла на более опасную/дорожную часть цикла разработки.

Там есть восхитительная простота синтаксиса Lisp-ish. Одной из сильных сторон Emacs является возможность выполнить произвольный код Lisp, нажав специальную последовательность клавиш на заключительном паре блока кода в любое время в любом буфере. Простой характер синтаксиса lisp, ограниченный круглыми скобками, делает это элегантным таким образом, что это было бы неудобно (нужно вводить фигурные скобки?) На большинстве других языков. Кроме того, регулярность (function arg, arg ...) и (оператор arg, arg ...) заставляет думать о функциях и операторах как первоклассных гражданах и мышление об анонимных функциях очень естественно, так что инфиксные операторы других языков, таких как Scala, не делают этого.

Мой ограниченный опыт работы с Scala не позволяет мне сказать, что синтаксис проще или читабельнее. Конечно, в Clojure есть какой-то несимметричный синтаксис с использованием макросов, но мое восприятие заключается в том, что эти макросы открывают небольшое окно в императивное мышление в синтаксисе, который в остальном очень функциональный. Наложение предпочтения функциональному или императивному синтаксису на языке может упростить ситуацию. Для этого я должен был бы указать на Clojure, Java и Haskell.

Моя забота о Scala связана с тем, что у меня было с C ++ или Perl (хотя и в меньшей степени); синтаксис языка вмещает несколько разных стилей мышления (Haskell и Java). Это делает его интересным для записи, но может быть проблематичным для удобочитаемости. Даже когда я пишу это, я помню, что Clojure поддерживает доменные Языки и задаются вопросом, в какой степени это подрывает мою точку зрения.

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

4
добавлено

Даже если мы пишем их с одинаковым синтаксисом скобок

И это в основном ответ на ваш вопрос.

нам нужно узнать, как каждый работает.

В то время как возможно использование DSL с не столь сложным синтаксисом, как Common Lisps loop с использованием обычных макросов (я оставлю макросы для чтения из этого), они в основном используются для контроля оценки и будут по-прежнему используйте регулярный синтаксис s-expression. Одна из важных особенностей заключается в том, что даже более сложные макрокоды loop -подобные могут быть прочитаны с использованием того же старого читателя sexpr.

Хотя это правда, что вам нужно будет узнать о различных макросах и форме ввода, которые они берут, например, cond Common Lisp с его более вложенными версиями cond Clojure>, уменьшающим один слой вложенности, который не только выполняется для макросов, но и для регулярных функций. Представьте себе обычную функцию, берущую кавычный список определенной структуры в качестве аргумента - вам все равно придется соответствовать ожидаемой структуре ввода, независимо от того, преобразует ли функция код, ожидает ли какой-либо алист, plist, дерево или что-то совершенно другое.

Всякий раз, когда вы сталкиваетесь с новыми функциональными возможностями, вам будет необходимо изучить некоторые API. Это также относится к языку, который допускал строгое синтаксис function (arg1, arg2, ..., argN) - вам все равно нужно было узнать, что такое ожидаемые аргументы, какие побочные эффекты и какие выход любой заданной функции.

Что проще в синтаксисе Lisp по сравнению с языком, например Scale, является то, что все представлено более или менее одинаково, а также то, что сам код использовал эти представления и структуры данных (это было бы homoconicity , о котором все говорят). Это различие в синтаксической сложности станет довольно ясным, если вы попытаетесь написать парсер Lisp или Clojure, а затем парсер Scala. Вам придется справляться с гораздо более сложной грамматикой - более сложные правила, касающиеся приоритетности, пробелов, двусмысленностей, других исключений и т. Д.

3
добавлено

Из описания :

В информатике синтаксисом языка программирования является набор   правил, которые определяют комбинации рассматриваемых символов   быть правильно структурированными программами на этом языке

Поскольку clojure является lisp, у вас есть s-выражения + список макросов читателей </а> и все.

В scala у вас есть классы, классы case, неявные лямбда с _, неявное ключевое слово, черты, общие аннотации, аннотации вариаций и т. Д.

Clojure имеет более простой синтаксис, поскольку функции могут быть реализованы как макросы или специальные формы. Это невозможно с помощью scala, в нем вам нужно добавить синтаксис для поддержки некоторых функций.

3
добавлено

Макросы не являются синтаксическими.

Рассуждая сложность экосистемы или базовой библиотеки - это совершенно другое обсуждение.

1
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Scala User Group
Scala User Group
1 486 участник(ов)

[RU] Scala Chat. Rules, additional links, FAQ: https://telegra.ph/Russian-Speaking-Scala-User-Group-08-27

Scala Jobs
Scala Jobs
852 участник(ов)

Rules: http://telegra.ph/My-lyudi-i-ehto-znachit-chto-nam-nuzhna-organizaciya-02-07 Main Scala Channel: https://t.me/scala_jobs_feed Flood Room: https://t.me/scala_ponv

Clojure — русскоговорящее сообщество
Clojure — русскоговорящее сообщество
433 участник(ов)

Общаемся на темы, посвященный Clojure. Решаем проблемы, обмениваемся опытом и делимся новостями. Вакансии и поиск работы: @clojure_jobs Вам могут быть интересны: @javascript_ru, @nodejs_ru, @ruby_ru, @devops_ru, @devops_jobs