Действительный идентификатор символов в Scala - PullRequest
48 голосов
/ 05 октября 2011

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

val #^ = 1 // legal
val #  = 1 // illegal
val +  = 1 // legal
val &+ = 1 // legal
val &2 = 1 // illegal
val £2 = 1 // legal
val ¬  = 1 // legal

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

С Программирование в Scala раздел 6.10,

Идентификатор оператора состоит из одного или нескольких символов оператора.Символы оператора являются печатными символами ASCII, такими как +,:,?, ~ Или #.

Точнее, символ оператора принадлежит к набору математических символов Unicode (Sm) или других символов (So) или 7-разрядным символам ASCII, которые не являются буквами, цифрами, круглыми скобками, квадратными скобками,фигурные скобки, одинарные или двойные кавычки или знак подчеркивания, точка, точка с запятой, запятая или обратный тик.

Поэтому мы исключены из использования ()[]{}'"_.;, и `

Я посмотрел математические символы Unicode в Wikipedia , но те, что я нашел, не включали +, :, ? и т. Д. Есть ли где-то окончательный список символов оператора?

Также, есть идеи, почему математические операторы Unicode (а не символы) не считаются операторами?

Ответы [ 2 ]

61 голосов
/ 05 октября 2011

Работа с синтаксисом EBNF в спецификации:

upper ::= ‘A’ | ... | ‘Z’ | ‘$’ | ‘_’ and Unicode category Lu
lower ::= ‘a’ | ... | ‘z’ and Unicode category Ll
letter ::= upper | lower and Unicode categories Lo, Lt, Nl
digit ::= ‘0’ | ... | ‘9’
opchar ::= “all other characters in \u0020-007F and Unicode
            categories Sm, So except parentheses ([]) and periods”

Но также с учетом самого начала лексического синтаксиса, который определяет:

Parentheses ‘(’ | ‘)’ | ‘[’ | ‘]’ | ‘{’ | ‘}’.
Delimiter characters ‘‘’ | ‘’’ | ‘"’ | ‘.’ | ‘;’ | ‘,’

Вот что я придумаюс.Работая путем исключения в диапазоне \u0020-007F, исключая буквы, цифры, скобки и разделители, мы имеем для opchar ... (барабанная дробь):

! # % & * + - / : < = > ? @ \ ^ | ~, а также Sm и So - за исключением скобок и периодов.

(Правка: добавление допустимых примеров здесь :).Таким образом, вот некоторые действительные примеры, которые выделяют все случаи - следите за \ в REPL, мне пришлось бежать как \\:

val !#%&*+-/:<=>?@\^|~ = 1 // all simple opchars
val simpleName = 1 
val withDigitsAndUnderscores_ab_12_ab12 = 1 
val wordEndingInOpChars_!#%&*+-/:<=>?@\^|~ = 1
val !^©® = 1 // opchars ans symbols
val abcαβγ_!^©® = 1 // mixing unicode letters and symbols

Примечание 1:

Я нашел этот Unicode индекс категории , чтобы выяснить Lu, Ll, Lo, Lt, Nl:

  • Lu (заглавные буквы)
  • Ll (строчные буквы)
  • Lo (другие буквы)
  • Lt (заглавные буквы)
  • Nl (буквенные цифры, такие как римские цифры)
  • Sm (математические символы)
  • То (символ другой)

Примечание 2:

val #^ = 1 // legal   - two opchars
val #  = 1 // illegal - reserved word like class or => or @
val +  = 1 // legal   - opchar
val &+ = 1 // legal   - two opchars
val &2 = 1 // illegal - opchar and letter do not mix arbitrarily
val £2 = 1 // working - £ is part of Sc (Symbol currency) - undefined by spec
val ¬  = 1 // legal   - part of Sm

Примечание 3:

Другие операторские вещи, которые являются зарезервированными словами: _ : = => <- <: <% >: # @, а также \u21D2 ⇒ и \u2190

10 голосов
/ 05 октября 2011

Спецификация языка . дает правило в главе 1, лексический синтаксис (на странице 3):

  1. Символы оператора. Они состоят из всех печатных ASCII персонажи которые не входят ни в один из вышеперечисленных наборов, математические символы (Sm) и другие символы (So).

Это в основном то же самое, что и ваша выдержка из "Программирование в программировании в Scala". + не является математическим символом Unicode, но это определенно печатный символ ASCII , не указанный выше (не буква, включая _ или $, цифра, парантез, разделитель).

В вашем списке:

  1. # недопустимо не потому, что символ не является оператором (# ^ допустимо), но потому что это зарезервированное слово (на странице 4), для проекции типа.
  2. & 2 недопустимо, поскольку вы смешиваете символ оператора & и неоператорный символ, цифра 2
  3. £ 2 допустимо, потому что £ не является символом оператора: это не семибитовый ASCII, а расширенный 8-битный ASCII. Это нехорошо, так как $ тоже не одно (это считается буквой).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...