LispyScript:支持宏的JavaScript實現
與其它類 Lisp 語言不同,不支持宏是JavaScript與生俱來的一個問題,這是因為宏會在編譯時操作語法樹,而這在像JavaScript這樣的語言中幾乎是不可能的。 LispyScript 是一種采用Lispy語法、支持宏的JavaScript實現。
在LispyScript中,開發者以樹形結構編寫JavaScript代碼。只要了解JavaScript和類Lisp語言,就可以輕松使用LispyScript。即使不了解類Lisp語言,也只需要學習如何以樹形結構編寫代碼。
下面是LispyScript中Hello World的示例代碼:
(console.log "Hello LispyScript!")
如上所示,LispyScript由括號中的表達式組成。表達式的第一個元素是一個函數或者LispyScript關鍵字。由空格分割的其它元素 為函數的參數。可以看出,LispyScript可以直接使用JavaScript函數。所有的JavaScript函數、對象和常量都可以用在 LispyScript中。
Lispy宏語法如下:
(macro name (arguments expression) (template expression))
開發者可以通過往代碼中增加宏來擴展LispyScript。比如,下面的代碼可以為LispyScript增加類似JavaScript console.log函數的print表達式:
(macro print (str rest...) (console.log ~str ~rest...))
下面是該宏的其中兩種調用方式:
(print "Hello print macro!") (print "2 + 2 = %d" (+ 2 2))
這就是宏的強大之處。開發者可以對語言本身進行擴展,或者創建自己的領域專屬語言。
除了支持宏外,LispyScript還支持如下特性:
- 尾調用優化;
- 回調序列:避免嵌套回調;
- Monads:允許開發者分步處理數據;
- 服務器端和瀏覽器端REPL;
- 內置測試特性:允許開發者在開發過程中測試代碼。
LispyScript 0.3.0及更高版本僅支持IE9及更高版本。但編譯生成的JavaScript代碼兼容所有的現代瀏覽器。LispyScript可以直接在瀏覽器中運行。不過,其運行速度要遜于加載服務器預編譯生成的JavaScript。
有關LispyScript的更多信息,請查看項目 文檔 及 GitHub頁面 。
下面是 Hacker News上的一些觀點 。
網友grayrest指出,JavaScript不是沒有宏支持,而只是沒有原生宏支持, sweet.js 就是證明。但sweet.js出現的時間要晚一些。aidenn0提到了 Parenscript 。該項目通過Common Lisp為JavaScript提供宏功能。breuleux提到了 Earl Grey 項目。他指出,該項目的宏系統是模塊化的,宏庫的編寫和發布非常方便。同時,他認為,類Lisp語法并不是宏系統必須的。evmar則自己維護著一個非常相似的 項目 。討論還提到了其它項目,如 spock 、 Sibilant 等。
另外,lispm認為,LispyScript的函數、宏和語法都不像Lisp,而更像 Clojure 。gjm11也有類似觀點,認為LispyScript與Lisp的關系正如JavaScript與Java的關系,它們是完全不同的語言。