LispyScript:支持宏的JavaScript實現

pdce 9年前發布 | 15K 次閱讀 LispyScript


與其它類 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則自己維護著一個非常相似的 項目 。討論還提到了其它項目,如 spockSibilant 等。

另外,lispm認為,LispyScript的函數、宏和語法都不像Lisp,而更像 Clojure 。gjm11也有類似觀點,認為LispyScript與Lisp的關系正如JavaScript與Java的關系,它們是完全不同的語言。

 本文由用戶 pdce 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!