Scala 是一個 static typed (!),並且融合 Object-Oriented 和 Functional Programming 兩大領域,在 JVM 上執行,可直接呼叫 Java API 的新語言。由 Martin Odersky (開發過 java generic 與 javac) 領導,在 2001 年時開始開發,於 2003 年時發表第一版。
它是一個純物件導向的語言 -- "Every value is Object"。支援 class 和 traits (應該是翻成 "特徵" 吧),traits 類似 java 的 interface,不過可以有部份的實作。因此,traits 可以做到 Mixin,即結合多個部份實作達到多重繼承的效果。(有用過 Ruby 的人應該知道 Mixin 有多好用了。)
它也是一個函數型 [1]的語言 -- "Every function is a value"。支援 Higher-order function [2]、nested function 以及 currying [3]。還有 pattern match (這個有點像是在解多項式.. ?),以及應用 pattern match 的 XML processing:
object XMLTest1 extends Application { val page = <html> <head> <title>Hello XHTML world</title> </head> <body> <h1>Hello world</h1> </body> </html>; Console.println(page.toString()) }或甚至在 xml 裡夾程式碼:
import scala.xml._ object XMLTest2 extends Application { val df = java.text.DateFormat.getDateInstance() val dateString = df.format(new java.util.Date()) def theDate(name: String) = <dateMsg addressedTo={ name }> Hello, { name }! Today is { dateString } </dateMsg>; Console.println(theDate("John Doe").toString()) }
這些不就是 dolphin 吵著要加入的功能嗎?現在 Scala 就有啦~ (上面的例子也看的出來 ,Scala 就是這樣子直接呼叫 Java 程式... 還真是狠)
再來,它是 static typed 的語言 (哈,這點很重要),在現在 dynamic typed 語言猖獗的時代裡,真是一股清流啊!內建支援 generic,而且比 Java "正常"多了。
最後,Scala 語言本身是可以擴充的,看這個範例:
object TargetTest1 extends Application { def whileLoop(cond: => Boolean)(body: => Unit): Unit = if (cond) { body ; //body 會被 function 取代 whileLoop(cond)(body) } var i = 10 whileLoop (i > 0) { //這段大括號內程式碼會被放到 body 裡 Console.println(i) i = i - 1 } //大括號結束 }
這是一個應用 currying 的例子,whileLoop()() 的第二層 argument body 所傳入的 function,直接取代body的位置。就這樣隨便寫寫就多了個 whileLoop 的新語法,真恐怖~~。有了這個要寫 Domain Specific Language 不成問題啦!
雖然它現在已經有不錯 eclipse plug-in 可以使用,又是直接在 JVM 上跑,要馬上上陣不成問題,語言功能也強的不像話,但... 基本上這算是個比較學術性的語言,用的人很少... 不能說這個語言能有什麼作為啦,但隱隱然有下一代語言的雛型。從它身上也許能夠窺見 Java 下一個 10 年的方向吧。
[1] 函數型語言 - Functional Programming
[2] 高階函數 - 即 function 可以拿 function 做為 argument 或是回傳值。
[3] currying - 目前我只知道是 function 可以有兩層以上 argument,然後一次給一部份,還在研究中...