2013-08-22 57 views
13

雖然clojure和clojurescript功能基本相同(除了明顯的區別),宏不是。當我需要clojurescript中的一個宏時,我必須將它寫入clojure中,並要求它使用require-macros。這是JavaScript的技術限制還是隻是一個設計決定?爲什麼兩者不能相同?爲什麼clojurescript宏不能寫入clojurescript?

回答

15

ClojureScript: Up and Running由Stuart Sierra和盧克VanderHart,第69頁:

宏是在編譯過程中應用。在運行時它們不存在 。由於 ClojureScript編譯器是在Clojure中實現的,因此必須在Clojure中將ClojureScript宏編寫爲 ,而不是ClojureScript。幸運的是,當涉及到操作數據結構時,Clojure和ClojureScript幾乎完全相同 ,因此在兩種語言之間切換 並不困難。

這意味着宏代碼在Clojure世界而不是在瀏覽器中執行,所以它必須用純Clojure編寫。

+1

就是這樣,因爲clojurescript使用谷歌封閉編譯器,我想...用clojurescript編寫的clojurescript編譯器會很好。 – islon

+2

Google Closure編譯器僅用於刪除未使用的依賴關係並縮小代碼,而不是將ClojureScript編譯爲JavaScript。當代碼到達Google Closure Compiler時,它已經只是JavaScript,儘管ClojureScript團隊努力確保所生成的JavaScript對於大多數高級Google Closure Compiler功能都是有效的。 – Serabe

+5

在相關說明中,正在對[clojurescript.net](http://clojurescript.net/)上的ClojureScript ClojureScript編譯器進行工作。其中一位作者在[本視頻]中進行了討論(http://www.infoq.com/presentations/cljs-in-cljs)。 – bmaddy