在Scala中有效的标识符字符

有一件事我觉得非常困惑,就是知道我可以在方法和variables名称中使用哪些字符和组合。 例如

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字符,如+,:,?,〜或#。

更确切地说,操作符属于Unicodemath符号集(Sm)或其他符号(So),或7位ASCII字符不是字母,数字,圆括号,方括号,大括号,单或双引号或下划线,句点,分号,逗号或反勾号字符。

所以我们排除使用()[]{}'"_.;,和`

我查了维基百科上的Unicodemath符号,但是我发现的符号不包括+:? 等等。有什么操作符是什么地方的权威列表?

另外,为什么Unicodemath运算符(而不是符号)不被视为运算符?

在规范中使用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 ''' | ''' | '"' | '.' | ';' | ',' 

这是我想出来的。 通过消除范围内的工作,消除字母,数字,括号和分隔符,我们有opchar …( opchar ):

! # % & * + - / : < = > ? @ \ ^ | ~ ! # % & * + - / : < = > ? @ \ ^ | ~还有SmSo – 除了括号和句号。

(编辑:在这里添加有效的例子:)。 总之,下面是一些有效的例子,强调了所有的情况 – 小心在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

  • 卢(大写字母)
  • Ll(小写字母)
  • Lo(其他字母)
  • Lt(titlecase)
  • Nl(字母数字,如罗马数字)
  • Sm(符号math)
  • 所以(符号其他)

笔记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

语言规范 。 给出了第1章中的规则,词法语法(第3页):

  1. 操作员字符。 这些由所有可打印的ASCII字符\ u0020- \ u007F组成。 (Sm)和其他符号(So)都不在上面的集合中。

这与您在Scala编程中的编程基本相同。 +不是一个Unicodemath符号,但绝对是上面未列出的ASCII可打印字符 (不是一个字母,包括_或$,一个数字,一个palenthesis,一个分隔符)。

在你的列表中:

  1. #是非法的,不是因为字符不是操作符(#^是合法的),而是因为它是一个保留字(第4页),因此用于types投影。
  2. &2是非法的,因为您将操作符和非操作符(数字2)混合在一起
  3. £2是合法的,因为£不是一个操作符:它不是一个七位ASCII,而是八位扩展ASCII。 这不好,因为$也不是一个(它被认为是一封信)。