2011/08/22

MoonScript概觀介紹

這一篇把MoonScript的首頁,概略翻譯出來。

MoonScript是個動態腳本語言,以CoffeeScript的語法為基礎,不過,編譯後的語言是Lua

成功安裝MoonScript後,你會得到:兩支執行檔moonmoonc,以及Lua模組moonscript。使用moon可以直接執行一支MoonScript程式檔;使用moonc可以把MoonScript程式檔編譯轉成Lua程式檔,之後再執行;在Lua程式裡加上require "moonscript",就能看懂、載入、執行MoonScript檔案了。

因為編譯後的結果是Lua程式碼,所以相容於各種Lua實作,包括LuaJIT,也相容於所有已經寫好的的Lua程式庫。

完整語言的介紹,請見MoonScript語言參考手冊(英文),我也寫了幾支小小的程式。接下來要概略介紹一下,因為我們可把MoonScript想像成為Lua披上並擴充較好看的語法外衣,所以你需要對Lua具有一定程度的了解。


概觀

MoonScript提供簡潔的語法,利用縮排來判斷並分割程式碼的各部分,而不是像Lua一樣使用囉嗦的關鍵字,也不是像C語言一樣使用大括號,利用縮排來定義語法的程式語言,有名的有Python。底下是MoonScript的一些述句構成。

export my_func
x = 2323

collection =
   height: 32434
   hats: {"tophat", "bball", "bowler"}

my_func = (a) -> x + a

print my_func 100

其了較簡潔的語法外,還加入了其他特色,包括table comprehensions、函式裡的implicit return、類別(class)、繼承(inheritance)、scope的管理述句import與export、以及很便利的物件建構述句with。

import concat, insert from table

double_args = (...) ->
   [x * 2 for x in *{...}]

tuples = [{k, v} for k,v in ipairs my_table]

當有錯誤發生時,它還能指出是在原先檔案裡的哪一行出錯,而不僅是編譯後的檔案。


安裝

最容易的方式是利用LuaRocks,以底下提供的rockspec來安裝:
> luarocks build http://moonscript.org/rocks/moonscript-0.1.0-1.rockspec

詳細安裝過程,我寫在另外一篇

選用功能

如果你使用Linux,並且想用watch模式,此模式會監視.moon檔,當有變動時就自動編譯成.lua檔。你需要安裝linotify


原始碼

專案原始碼放在GitHub上:https://github.com/leafo/moonscript

有任何問題,請到這裡回報:https://github.com/leafo/moonscript/issues

最新的開發版本(或許不能動喔)可以用底下的rockspec安裝:
> luarocks build http://moonscript.org/rocks/moonscript-dev-1.rockspec


相依於其他軟體套件

除了Lua 5.1外,MoonScript還需要底下的Lua模組:
  • linotify(在Linux上的選用功能)

若你使用LuaRocks來安裝MoonScript,這些套件都會被自動取回並安裝。


學習

完整的語言參考手冊(英文)在此。


其他外掛

差異處的概略介紹
  • 利用縮排與空白字元來定義出程式區塊
  • 所有變數宣告,預設為區域變數。
  • export關鍵字來宣告全域變數,用import關鍵字來匯入table裡的東西,也就是取得一份區域性的拷貝。
  • 函式呼叫時,括號是可有可無的,類似於Ruby。
  • 胖箭頭,=>,用來產生具有self參數的函式。
  • 在名稱之前加上@(小老鼠),用來指稱它是個self裡的東西。
  • 運算子!(驚嘆號),可用來呼叫無參數的函式。
  • 根據函式裡最後一個述句的型別,自動加上implicit return。
  • 使用:(冒號)來分開table裡的鍵與值,而不是用=(等號)。
  • 換行(newline)可用來區分開table裡的每一項目,逗號(,)也可以。
  • \(反斜線)來呼叫物件的方法,而不是用:(冒號)。
  • 支援+=-=/=*=%=運算子。
  • !=~=的別名。
  • table comprehension,很便利的slicing與iterator語法。
  • 程式碼若一行,可以在後面加上迴圈與if述句。
  • if述句,可當做運算式使用。
  • 具有繼承的類別系統,建構在metatable __index屬性之上。
  • 建構子的參數,若以@開頭,會自動指定給物件。
  • 魔法般的super函式,將同名的類別方法對應到父類別的方法。
  • with述句,讓你以較短的語法存取無名的物件。


關於

MoonScript的語法,有很大程度是被CoffeeScript激發而來的。

沒有LPeg這個超棒超強的語法解析工具,MoonScript是不可能誕生的。

No comments:

Post a Comment