Scala中的有效标识符字符

时间:2011-10-05 05:11:23

标签: scala operators

我觉得很困惑的一件事是知道我可以在方法和变量名中使用哪些字符和组合。例如

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字符不是字母,数字,括号,正方形   括号,花括号,单引号或双引号或下划线,   句号,分号,逗号或后退字符。

因此我们被排除在使用()[]{}'"_.;,和`

之外

我在Wikipedia上查找了Unicode数学符号,但我发现的那些符号不包括+:?等。是否有某个确定的列表操作员角色是什么?

此外,任何想法为什么Unicode数学运算符(而不是符号)不算作运算符?

2 个答案:

答案 0 :(得分:61)

使用规范中的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 ...(鼓号):

<强> ! # % & * + - / : < = > ? @ \ ^ | ~ 以及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 category index来找出Lu, Ll, Lo, Lt, Nl

  • Lu(大写字母)
  • Ll(小写字母)
  • Lo(其他字母)
  • Lt(titlecase)
  • 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

答案 1 :(得分:10)

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

  
      
  1. 操作员角色。这些包括所有可打印的ASCII   字符\ u0020- \ u007F。以上都没有,   数学符号(Sm)和其他符号(So)。
  2.   

这与您在Scala中编程编程的摘录基本相同。 +不是Unicode数学符号,但它绝对是上面未列出的ASCII printable character(不是字母,包括_或$,数字,副词,分隔符)。

在您的列表中:

  1. #是非法的,因为该字符不是运算符 (#^是合法的),但因为它是保留字(第4页),用于类型投影。
  2. &amp; 2是非法的,因为你混合了一个操作员角色&amp;和非操作符,数字2
  3. £2是合法的,因为£不是运算符字符:它不是7位ASCII,而是8位扩展ASCII。这不好,因为$也不是一个(它被认为是一封信)。