Scala の syntax
俺様 scala.vim を作成中に出くわした Scala の syntax の(知らなくてよさそうな)仕様について・・・
Unicode escape
\u1234
のような形は tokenize に先立ち unicode文字にエスケープされる:
val \u0061b = 3 // val ab = 3
u
は何個ついてもok:
val \uuuuuu0061b = 3 // val ab = 3
SLS(のpdf)ではずっと\
は奇数個ならokとなっていたが単に記述間違いだったらしい。
Dollar sign
使用は非推奨だが、$
は letter に属し、大文字扱いである。予約語ではない:
val x$y = 3 // ok class $ // ok
Underscore
_
も letter に属し、大文字扱いである。予約語である:
val x_y = 3 // ok class _ // error
Identifier
ざっくり言うと、_
を付けると、その後に記号が続いていい。ただしその場合、_
の手前が空なのは駄目。
val ab = 3 // ok val ab_+% = 3 // ok val _+% = 3 // error
記号のみは何個続いてもいいが、途中に letter や数字が混ざっては駄目。
val +:+/^% = 3 // ok val +:+a = 3 // error!
Octal character escape
'\141' // a
deprecated らしい。
Hex Numeral
0xff // ok 0Xff // ok?
なぜか大文字のX
がずっと SLS(のpdf)から抜けていたが、記述忘れだったらしい。
Multi-line string literal
"a\\b" // a\b """a\\b""" // a\\b
エスケープしてほしいときは、StringContext.treatEscapes
を使える。
Unicode escape はすでに前処理でエスケープ済みであることに注意。
Processed string literal
いわゆる string interpolation のことである。複数行いかんにかかわらず\n
等をエスケープしない。
その処理は string interpolator の実装に委ねられる。特に、標準のs
はエスケープする。
s"a\\b" // a\b s"""a\\b""" // a\b
特別なエスケープ$abc
が用意されているが、tokenize が微妙なことになっている:
val a_+ = 3 s"$a_+" // not found: value a_
バグかと思ったらSIPの記述どおりだった。
Symbol literal
'
のあとに identifier が続いたもの。
'\ // error
は仕様上はokそうだがエラーになってしまった。