スカラってPascalの子孫かい?

連休を利用して、稲刈りをした農家が多かったようだ。散歩道にある田が、まだら模様に なっていた。子供の頃は、稲刈りの季節になると、「稲刈り休み」なんてのがあったなあと、 思い出しちゃったぞ。

今は、田にコンバインだかが入って、おじさん一人で稲刈りをしてる所を見ると、楽に なったと言えばそれまでだけど、機械代を考えたら、割りに合わない商売だろうに。

まだ稲刈りが済んでいない田を見ると、稲が青々してる。稲穂も十分に実を付けていなかったり して、このままじゃ収穫もおぼつかなそう。

植えた品種が、不純な天候に向かなかったのか、肥料や手入れの問題だったのか、知るよしも ないが、さぞやがっかりでしょう。来年こそは、良い米が出来ますように。

Scala vs Cloure

JVMと言う箱庭で対決が行われています。 Scala Vs Clojure ? です。clojure って何よ,Scalaって何よと言うむきには、簡潔に、

one is a Lisp the other a Curly braces language.

ははは、確かにそうだわさ。私は、捻れた括弧より、丸い括弧の方が好きだったりします。

この著者も、丸括弧万歳組ですか。factを使って、ベンチマークしてるんですが、そんなの

Your factorial microbenchmark is mostly measuring the performance of 
java.math.BigInteger. Did you remember to profile it?

と言われていて、笑ってしまいましたよ。

def time(n: Int, fun: () => Unit) = {
    val start = System.nanoTime
    (0 until n).toList.foreach((_: Int) => fun())
    ((((System.nanoTime - start): Double) / (n: Double)) / 1000000.0)
}

val t = time(200, () => fact(5000))
println("Runtime: " + t + "ms")

これを見ると、Scalaも関数を引数として渡せるのね。 どうせベンチするなら

(define (tak x y z)
	(if (> x y)
        (tak (tak (- x 1) y z)  (tak (- y 1) z x)  (tak (- z 1) x y))
         y))

こういうのでやれば、文句をつけられなかったのに。

ScalaってPascalの子孫かい?

ふとチュートリアルを見てて

import java.util.{Date,Locale}
import java.text.DateFormat
import java.text.DateFormat._

object FrenchDate{
  def main(args:Array[String]){
    val now= new Date
    val df=getDateInstance(LONG,Locale.FRANCE)
    println(dfformatnow)
  }
}

ここに出てくる、val now ... とか、 arg : Array[String] って、Pascal流ちゃう? と 思ったのでした。

Scaclaの発祥の地は、スイス連邦工科大学。 ここって、ニクラウス・ヴィルト先生がPascalを 作った本拠地じゃないですか。ScalaってJavaの申し子と言われてるけど、Pascalを実現 する時の下働きとして活躍した P-codeが今はJavaに変わっただけね。

あからさまにJavaを隠しちゃうと問題になるので、ちとJavaを露出させた、あるいはヴィルト 先生の引力圏から脱出したかったとか?

var で宣言されたやつは、書き換え可能だけど、val で宣言したやつは、const にしちゃえで Haskell風味の味付け。あれ? 純正Pascalに constなんてあったっけかな? 「アルゴリズム+データ構造=プログラム」が、奇跡的に保管されてたので調べたら、const有ったよ。 もう、30年も前の出来事でした。ちと、名前を変えましたってか。私は、valよりconstの方が 好みだぞ。

ちまちまとスカラするぞ

Welcome to Scala version 2.7.6.final (Java HotSpot(TM) Client VM, Java 1.6.0_16).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val x = 10
x: Int = 10

scala> x = 30
<console>:5: error: reassignment to val
       x = 30
         ^

scala> var z = 123L
z: Long = 123

scala> var z = 456.7D
z: Double = 456.7

scala> var z = 89.0F
z: Float = 89.0

var を導入した時点で、Ocamlのレベルになった!(純粋関数型を捨ててしまった)

scala> val r = 1 to 4
r: Range.Inclusive = Range(1, 2, 3, 4)

scala> var s = 1 until 4
s: Range = Range(1, 2, 3)

scala> (1 to 5).map( x => x * x ) 
res5: RandomAccessSeq.Projection[Int] = RangeM(1, 4, 9, 16, 25)

scala> for( x <- 1 to 5 ) yield x * x
res6: RandomAccessSeq.Projection[Int] = RangeM(1, 4, 9, 16, 25)

型の説明がJava流に長くて鬱陶しいぞ。まあ、土台からしてしょうがない。

scala> var p = (3.0, 4.0)
p: (Double, Double) = (3.0,4.0)

scala> var x = p._1
x: Double = 3.0

scala> var y = p._2
y: Double = 4.0

scala> var q = (1,2,3,4,5,6,7,8)
q: (Int, Int, Int, Int, Int, Int, Int, Int) = (1,2,3,4,5,6,7,8)

scala> q._8
res7: Int = 8

タプルの扱いは、Haskellより楽そう。タプルがあるなら当然、ListやArrayやMapやSetが あるはずだ。ちと、試してみる。

scala> var l = List(1,2,3)
l: List[Int] = List(1, 2, 3)

scala> 123 :: l
res0: List[Int] = List(123, 1, 2, 3)

scala> l ::: List(4,5)
res3: List[Int] = List(1, 2, 3, 4, 5)

scala> "foo" :: "bar" :: "baz" :: Nil
res4: List[java.lang.String] = List(foo, bar, baz)
scala> var a = Array(1,2,3,4)
a: Array[Int] = Array(1, 2, 3, 4)

scala> a(2)
res7: Int = 3

scala> Set("red", "green", "blue")
res8: scala.collection.immutable.Set[java.lang.String] = Set(red, green, blue)
scala> import scala.collection.mutable.Map
import scala.collection.mutable.Map

scala> var m = Map("Jan" -> 1, "Feb" -> 2)
m: scala.collection.mutable.Map[java.lang.String,Int] = Map(Feb -> 2, Jan -> 1)

scala> m += ("Mar" -> 3)

scala> m
res10: scala.collection.mutable.Map[java.lang.String,Int] = Map(Feb -> 2, Mar -> 3, Jan -> 1)

scala> m("Jan")
res11: Int = 1

まあ、癖があるけど、慣れるしかないか。

scala> var str = """Hellow,
     | I am Scala.
     | I like Haskell, Ocaml, and more.
     | """
str: java.lang.String = 
Hellow,
       I am Scala.
       I like Haskell, Ocaml, and more.


scala> "%d-%d-%d AM %d:%d".format(2009,12,31,11,22)
res13: String = 2009-12-31 AM 11:22

Pythonぽいのはいいんだけど、ちと、余計なお世話が混じるなあ。

切りがないので、後は、docでも 見て、混血具合を確認してください。Scala API and code examplesを 手元に置くのもいいですね。

参考リンク

scalaの勉強会資料

みんなのコード

IBMのシリーズ物

基礎を終えた人のScalaミニtips