seratch's weblog in Japanese

About Scala, Java and Ruby programming in Japaense. If you need English information, go to http://blog.seratch.net/

Scala言語仕様 2.8 リーディング - 1 字句構文

これはAkasaka.scala読書会の記録です

これはAkasaka.scalaでの読書会の記録です。私が事前にある程度準備しておいて、読書会当日に修正・追記を行います。

http://akskscala.github.com/

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.1 整数リテラル (Integer Literals
  • 要請型(expected type) ?
0             21           0xFFFFFFFF          0777L
1.3.2 浮動小数リテラル (Floating Point Literals
0.0       1e30f          3.14159f      1.0e-100          .1
1.3.3 ブーリアンリテラル(Boolean Literals)
true         false
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)

// 一行コメント

/* 
 * 複数行コメント
 */

1.5 XML モード (XML mode)

Scalaの構文には二つのモードがあります。

  • Scalaモード(normal mode)
  • XMLモード(XML mode)

XMLモードは「<」から始まるXML式(パターン)の解析が成功し、その後Scala式(パターン)に遭遇して通常モード(normal mode)に戻るまでです。

val b = <book>
          <title>The Scala Language Specification</title>
          <version>{scalaBook.version}</version>
          <authors>{scalaBook.authors.mkList("", ", ", "")}</authors>
        </book>