スカラって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を 手元に置くのもいいですね。