最近更新: 2011-12-08

粗略看過 CoffeeScript 的語法特徵

今天我來說個新的程式語言,CoffeeScript 。 CoffeeScript 的編譯器會將它的程式碼轉譯成 JavaScript 程式碼。它產生的 JavaScript 程式碼基本上可以在任何 JavaScript 環境中運行。

我沒有用過這玩意,只是它的語法令我覺得有點意思。CoffeeScript 的設計目的,在為 JavaScript 環境提供一個「更整潔的語法」。我大致看了一下它的程式碼範例,它大部份的語法混合了 Python 與 Ruby 的風格,但程式碼區塊(匿名函數)這部份則是採用 C# 語法。 我們來看看「Your first cup of CoffeeScript, Part 1: Getting started」這篇文章中的範例程式碼,初步認識 CoffeeScript 的語法。

具 Python 特徵的語法是其程式段落格式採用 Python 風格,捨棄配對括號,而嚴格地使用縮排區分段落,但不用加 : 。

具 Ruby 特徵的語法是:

  • 函數呼叫像 Ruby 一樣可以略去參數列的 () 括號。
  • 字串竄寫是用 #{}。
  • 後置條件式。
  • Ruby 的 range 表達方式。
  • 但不採用 Ruby 的迭代用法。

匿名函數則是 C# 格式,但將函數內文的連接符號從 => 改為 -> 。此外,若函數不接受參數,那代表參數列的 () 可以省略。

先看參考文章 Listing 2 的 CoffeeScript 程式碼:

for i in [0..5]
    console.log "Hello #{i}"

用 Ruby 來讀的話,將是:

(1..5).each do |i|
  puts "Hello #{i}"
end

用 Python 來讀則是:

for i in range(5):
  print("Hello %s" % i)

再看參考文章 Listing 5 的 CoffeeScript 程式碼:

stdin.on 'data', (input) -> 
    name = input.trim() 
    process.exit() if name == 'exit' 
    console.log "Hello #{name}"

按照 C# 風格可讀為:

stdin.on("data", (input) => {
    var name = input.trim() 
    if (name == "exit")  
        process.exit()
    console.log(@"Hello $name}")
}
)

但我另外想到一個問題,按照 CoffeeScript 縮排分段方式,匿名函數幾乎只能放在最後一個參數。 如果我要傳遞兩個匿名函數,我就不知道要如何縮排了。 例如 C# 的這一行 a_method( (i) => i+1, () => 1 ),似乎就寫不出來。

它揉雜了許多程式語言的特徵,在我看來,有些表達風格顯得不一致。 從程式碼的字數來算,需要輸入的字數確實比較少了;但從文字閱讀的角度來看,似乎不是那麼容易看得明白。

樂多舊網址: http://blog.roodo.com/rocksaying/archives/18352007.html

樂多舊回應
未留名 (#comment-22168451)
Thu, 08 Dec 2011 18:24:24 +0800
用小括號包起來就可以縮排了。

另外 CoffeeScript 也支援 => 產生匿名函式,但是 -> 和 => 兩個產生出來的匿名函式有不同的功用,這點可以參考官方網站的說明。
未留名 (#comment-22169127)
Fri, 09 Dec 2011 12:13:26 +0800
: 用小括號包起來就可以縮排了。
嗯,這樣看來它的語法分析器寫的不太好。
或者說,它的表達形式不一致,使語法存在易於混淆之處,才造成它的語法分析有這樣的毛病。