Имеет ли Scala небольшое количество базовых синтаксических функций?

Scala - это интересный язык, который утверждает, что он является кратким, масштабируемым (имея множество функций, указанных в библиотеках, а не компилятором), и для поддержки DSL. В попытке добиться этого у него есть много операторов плюс трюки компилятора (например, для поддержки операторов infix и, например: _ *, чтобы сгладить последовательность).

Я нахожу множество операторов (2½ страницы в индексе "Программирование в Scala" ), а компилятор смущает. Справедливости ради следует отметить, что многие из операторов являются обычными арифметическими/булевыми операторами, взятыми из C и др.).

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

Есть ли несколько правил (и если да, то каковы они), или я обречен узнать многие "операционные" методы и импликации в библиотеках?

Ответ 1

Есть два способа понять ваш вопрос об операторах:

  • Каковы правила, определяющие, как операторы обрабатываются компилятором Scala? (Правила языка)
  • Каковы правила, определяющие порядок определения операторов в библиотеках? (Определения оператора)

Правила языка

Есть действительно правила. Я позволю вам определить, думаете ли вы, что есть "несколько" или нет. Как и большинство вещей Scala, вы можете найти их в Language Reference, раздел 6.12.

Наиболее важные бит:

  • Единственными принятыми префиксными операторами являются +, -, ! и ~.

  • Любой метод, который не принимает аргументов, может использоваться как постфиксный оператор.

  • Любой метод, который принимает один аргумент, может использоваться как оператор инфикса. Однако приоритет этих операций подчиняется определенным правилам, по-видимому, главным образом, так что арифметические и другие выражения рассматриваются так, как можно было бы ожидать. Приоритет определяется первым символом имени оператора/метода и соответствует тому, что вы ожидаете от C или Java.

  • Все операторы infix являются лево-ассоциативными, за исключением тех, которые заканчиваются на :. Типичные примеры включают :: и +:.

Итак, четыре правила, в основном. Я рекомендую вам прочитать спецификацию для более глубокого понимания.

Определения операторов

Выбор определений операторов зависит от конструктора (ов) библиотеки. Например, библиотека коллекции Scala использует относительно небольшой и согласованный набор операторов (++, --, **, +=, -=, ++=, --=, +: и т.д.). Комбинаторы Parser поставляются с более экзотическим набором, и некоторые библиотеки могут быть полностью непроницаемы сначала для профанов из-за их пользовательских определений операторов (sbt или Lift приходят на ум, хотя это только мое личное мнение).

Это было признано как источник потенциальных проблем, а руководство стиля Scala имеет this, чтобы сказать о именах символических методов (пользовательские операторы ):

Избегайте! Несмотря на то, что Scala облегчает эту область проектирования API, определение методов с символическими именами не должно выполняться легко, особенно когда сами символы нестандартны (например, >>#>>). Как правило, имена символьных методов имеют два допустимых варианта использования:

  • Языки, относящиеся к домену (например, actor1 ! Msg)
  • Логически-математические операции (например, a + b или c :: d)

Ответ 2

Scala не имеют специальной обработки для операторов

Извлечен из книги "Программирование в Scala 2ed"

Любой метод может быть оператором

В Scala операторы не являются специальными синтаксис языка: любой метод может быть оператором. Что делает метод оператор - как вы его используете. Когда вы пишете "s.indexOf('o')", indexOf не является оператором. Но когда вы пишете индекс indexOf 'o', indexOf является оператора, потому что вы используете его в обозначениях оператора.

Я не могу найти 2 1/2 страницы в индексе, о котором вы говорите.

Операторы

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

В базовой реализации Scala могут использоваться примитивы для повышения производительности на уровне байт-кода, но это прозрачно для конечного пользователя.

Операторы

Итак, здесь правило прост: каждый оператор на самом деле является методом, определенным на некотором типе. Инфракрасная нотация оператора является просто вопросом удобочитаемости, например

val sum = 1 + 2

читается намного лучше, чем

val sum = 1.+(2)

Это обозначение также является базой для построения dsl с "естественным ощущением". Эта тестовая библиотека ScalaSpecs дает четкую демонстрацию этого.

Специальные правила компиляции

Существует ограниченное количество "настроек компилятора", как вы сказали, которые доступны для вышеупомянутой цели, позволяя получить более понятный и понятный код.

Соответствующее резюме этих "твиков" может найти здесь

Ответ 3

Вся информация доступна на fooobar.com/info/tagged/... и в spec,

Вот моя рекомендация о том, с чего начать:

  • Узнайте, как анализировать последовательность идентификаторов в операнды и операторы. См. Мой ответ Когда использовать круглую скобку в нотации Scala infix в этом разделе.
  • Вспомните о приоритете оператора . Лично я просто помню те, что были для арифметических +, -, *, /, что буквы имеют самый низкий приоритет и что странные unicode имеют самые высокие значения. В остальном я добавляю скобки или просто догадываюсь, что приоритет будет "работать", как это предполагал дизайнер DSL или как на Java.
  • Изучите операторы x :: xs и xs ::: ys для списков, поскольку они настолько распространены и связаны справа, потому что они заканчиваются на :.
  • При желании, если вам интересно, попробуйте взглянуть на раздел 6.12 Prefix, Infix и Postfix Operations спецификации, чтобы вы знали в каком-то уголке вашего мозга, что есть определенные особенности в отношении оператора, имеющего = и префиксными операторами.

Наконец, последнее слово совета. Не пытайтесь изучать всех операторов, не предполагайте, что вы должны знать все значения операторов, чтобы эффективно использовать язык. То есть, если вы не изучили другие языки, прочитав и вспомнив полный API.