hakobera's blog

技術メモ。たまに雑談

はじめてのScala その2 言語仕様(1)

前回はScalaの導入でしたが、今回はScalaの言語仕様について調べることにした。
理由は日本語でまとまった文献がみつからなかったから。

ということで、↓が元ネタ
http://www.scala-lang.org/docu/files/ScalaReference.pdf (2008/05/29現在でversion 2.7)

可能な限り、元ネタの章立てにのっとってまとめることにする。

文法

BNFとかは省略。気が向いたら書くかも 明日書きます。

プリミティブ型

byte    (-128 〜 127)                                 = 8bit
short   (-32768 〜 32767)                             = 16bit
char    (0 〜 65535)                                  = 16bit 符号なし
int     (-2147483648 〜 2147483647)                   = 32bit
long    (-9223372036854775808 〜 9223372036854775807) = 64bit
float   (-128 〜 127)                                 = IEEE 754 32bit 単精度
double  (-128 〜 127)                                 = IEEE 754 64bit 倍精度
boolean (true, false)
String

Javaと一緒。

Identifiers (予約語のみ抜粋)
abstract  case     catch    class    def
do        else     extends  false    final
finally   for      forSome  if       implicit
import    lazy     match    new      null
object    override package  private  protected
requires  return   sealed   super    this
throw     trait    try      true     type
val       var      while    with     yield
_   :   =   =>   <-   <:   <%   >:   #   @

JavaC#Rubyを足して3で割った感じ。

Newline Characters (改行ではなくて文の終端文字)
セミコロン(;)または改行

これはRubyと同じ。

  • 文末にかける識別子
this null true false return type <xmlstart>
_    )    ]    }
  • 文頭にかけない識別子
catch else  extends finally forSome match requires
with  yield ,   .   ;   :   _   =   =>   <-  <:  <% 
>:  #  [  )  ]  }

Literals (定数)

  • 整数 (Int or Long)
  • 小数 (Float or Double)
  • Boolean (true or false)
  • Character ('〜')
  • String ("〜")
  • Multiline-String ("""〜""")
  • Symbol ('〜)

JVM上で動くのでここは対応するJavaと同じ表記になっていることがわかる。
整数、小数の記述方法はJavaとまったく同じなので省略した。

Multiline-StringとSymbolがJavaにはないリテラル
Miltiline-StringはこれはRubyとかのヒアドキュメント表記と似たような感じで、"""〜"""で囲んだ文字列を改行を含めて保持する。
例えばこんな感じ。

"""the present string
spans three
lines."""

SymbolはこれもRubyのシンボルと同じで、実態はscala.Symbolクラスのインスタンスとなる。

override def toString: String = 'name

上記は scala.Symbol("name") の短縮表記

Comments (コメント)

  • 1行コメント (//〜文末まで)
  • 複数行コメント (/* 〜 */)
// 1行コメント

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

これもJavaと一緒。

XML mode

XMLが文法としてサポートされていて、直接かけて、中に{〜}形式でscalaのトークンを埋め込める。
JavaのVelocityとかJSPRubyのERBに似た感じ。

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

とりあえず予約語とかリテラルとかはこれで終了。
長くなってきたので、今日はここまで。

明日からはクラス定義とかを調べていくことにする。