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