Scala言語仕様 2.8 リーディング - 1 字句構文
Scala言語仕様
日本語訳(Scala 2.8)
http://www.scala-lang.org/docu/files/LangSpec2.8-ja_JP.pdf
原文(Scala 2.9)
http://www.scala-lang.org/docu/files/ScalaReference.pdf
1.1 識別子 (Identifiers) .
識別子の命名ルールについての説明です。
- Unicode基本多言語面 (16bitの領域、BMP:Basic Multilingual Plane)の文字セットを使用できる
- 補助文字(Supplementary Characters)は現在サポート外
- Javaと同様に数字から始まる名前は使えない(数字のリテラルと解釈しようとする)
- 予約語と同じ名前は「`」で囲めば使うことができる
- 「←」「⇒」も予約語
具体例が「Example 1.1.1」にまとまっています。
x Object maxIndex p2p empty_?
+ `yield` αρετη _y dot_product_*
__sysstem _MAX_LEN
「?」についてはその前に「_」をつければ使えるということ?
scala> val empty? = "" <console>:1: error: illegal start of simple pattern val empty? = "" ^ scala> val empty_? = "" empty_?: java.lang.String = ""
どうやら「\u0020-\u007F」の文字はそうすればつかえるということのようです。
opchar ::= "all other characters in \u0020-007F and Unicode categories Sm, So except parentheses ([]) and periods" op ::= opchar {opchar} idrest ::= {letter | digit} ['_' op
「?」の他には例えば「~」など。
scala> val foo_~ = "sss" foo_~: java.lang.String = sss
1.2 改行文字
Scalaはセミコロンもしくは改行で文を終えることができます(行指向(line-oriented)言語)。
改行文字が文の区切りである「nl」として扱われる条件:
- 改行の直前のトークンで文を終結できる
- 改行の直後のトークンで文を開始できる
- 改行が改行可能な場所にある
文の開始や終了、改行の挿入条件について詳細な解説が続きます。
- caseはclass、objectが続く場合のみ文を始められる
- 「()」の間、「[]」の間、caseとその=>の間、XMLモード解析領域は改行不可
「Example 1.2.5はScala 2.9.1時点でSerializableをextendsするようにdeprecated指定されています。
1.3 リテラル (Literals)
1.3.4 文字リテラル (Character Literals
'a' '\u0041' '\n' '\t
'\u000A' は有効な文字リテラルではないことに注意してください。 なぜなら、リテラル解析の前 にユニコード変換され、ユニコード文字 \u000A (ラインフィード) は印字可能な文字ではない からです。 その代わりに、エスケープシーケンス 'n' あるいは 8進法のエスケープ '\12' (§ 1.3.6)を使えます。
1.3.5 文字列リテラル (String Literals)
"Hello,\nWorld!" "This string contains a \" character."
複数行文字列リテラル (Multi-Line String Literals)
いわゆるヒアドキュメントです。
"""the present string spans three lines."""
stripMarginを使うと先頭の空白文字を除去できます。
http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.StringLike
"""the present string |spans three |lines.""".stripMargin /* 出力結果 the present string spans three lines. */
1.3.6 エスケープシーケンス (Escape Sequences)
\b \u0008: バックスペース BS \t \u0009: 水平タブ HT \n \u000a: ラインフィード LF \f \u000c: フォームフィード FF \r \u000d: キャリッジリターン CR \" \u0022: ダブルクォート " \' \u0027: シングルクォート ' \\ \u005c: バックスラッシュ \
1.3.7 シンボルリテラル (Symbol literals
'x
scala.Symbol("x")
1.4 空白文字とコメント (Whitespace and Comments)
// 一行コメント /* * 複数行コメント */