PS

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

複数行文字列リテラルは、\n等をエスケープしない:

    "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そうだがエラーになってしまった。

参考文献