在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
):
! # % & * + - / : < = > ? @ \ ^ | ~
! # % & * + - / : < = > ? @ \ ^ | ~
还有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
:
- 卢(大写字母)
- 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页):
- 操作员字符。 这些由所有可打印的ASCII字符\ u0020- \ u007F组成。 (Sm)和其他符号(So)都不在上面的集合中。
这与您在Scala编程中的编程基本相同。 +
不是一个Unicodemath符号,但绝对是上面未列出的ASCII可打印字符 (不是一个字母,包括_或$,一个数字,一个palenthesis,一个分隔符)。
在你的列表中:
- #是非法的,不是因为字符不是操作符(#^是合法的),而是因为它是一个保留字(第4页),因此用于types投影。
- &2是非法的,因为您将操作符和非操作符(数字2)混合在一起
- £2是合法的,因为£不是一个操作符:它不是一个七位ASCII,而是八位扩展ASCII。 这不好,因为
$
也不是一个(它被认为是一封信)。