技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Scalaが面白いという話を聞いて遊び始める

基本はここからダウンロードしてインストールするだけ。IsPackインストーラあるから便利ね。
Java6最新update入ってりゃ基本問題ないはず。
IDE はこっちにあった。
そしてざくっとコード書く。

class Upper {
  def upper(strings:String*): Seq[String] = {
    strings.map((s:String) => s.toUpperCase())
  }
}

var up = new Upper
Console.println(up.upper("hello ","scala"))

とりあえずスクリプトモードで起動。

scala sample1.scala
ArrayBuffer(HELLO , SCALA)

サンプルコードを動かして理解。

class Upper {
  def upper(strings:String*) = strings.map(_.toUpperCase())
}

var up = new Upper
Console.println(up.upper("hello ","scala"))

分かったこと。

  • ブロック{}の意味はやっぱ手続きの内包なのかね?(関数とOOPの併せだからかね)
  • 関数型言語特有の暗黙方推論も健在
  • Java のクラスをシームレスに呼べる
  • ラムダ式が平然と書ける

Haskell,F# やってて良かった。まだ特になんの疑問もないよ。
エントリポイントなくてもスクリプトでなら動くのか、EclipseIDE上だとエラーになった。
ということで、エントリポイント。

object Upper {
  def main(args:Array[String]) = {
    args.map(_.toUpperCase()).foreach(printf("%s,", _))
    println("")
  }
}

エントリポイントを実行する方法は経験上幾つかあって、

  • モジュールを読んだ際に、実行手続がある場合に暗黙実行(mainなしパターン)
  • エントリポイントを識別するタグを作成する。(F#のEntryPoint属性とか)
  • 特定の名前を予約し、それをエントリポイントとする。

パターン的には3つ目のようで、その場合複数の定義があると混乱とエラーを招く。Java の場合は、エントリ定義が複数ある場合は、実行時にクラスを指定してエントリを叩く。この時、注意が必要なのは、メソッドはstaticないしは、シングルトン定義である必要がある。
これは、new したときに、エントリポイントとなる関数が増えてしまう矛盾を避けるためだ。

上記のサンプルで static あるの?と一瞬思ったが、関数に static かそれに準じたものがないので、「object」がシングルトンの定義なんだと解釈。