2013-03-01 37 views
4

是否有一個clojure和clojurescript的宏,它允許您插入不同的表達式,具體取決於文件是否正在編譯爲clojure或clojurescript?是否有一個if-clojurescript宏?

(if-clojurescript 
    (my clojurescript definition) 
    (my clojure definition)) 

基本上我尋找的東西就像你可能會看到周圍的C++代碼灑的#ifdef SOME_PLATFORM宏。我認爲這對於我希望成爲交叉部分的文件可能是有用的,但是該文件的一小部分在clojure/clojure-script之間不兼容。

回答

3

你可以檢查*clojure-version*

user> (if *clojure-version* "I'm Clojure" "I'm ClojureScript") 
"I'm Clojure" 

cljs.user> (if *clojure-version* "I'm Clojure" "I'm ClojureScript") 
"I'm ClojureScript" 

,你不能中立位分裂語言到自己的文件(最好)這可能是十分有用。我個人的觀點傾向於避免使用太多這樣的東西。

(defmacro if-clojurescript [clj-form cljs-form] 
    (if *clojure-version* clj-form cljs-form)) 
+0

這看起來很有希望。但是有沒有一種通用的方法來使用/需要一個宏? Clojurescript似乎需要:use-macros,但這會在clojure中引發錯誤。沒有一種語言中立的方式來要求一個宏,我不明白這是如何工作的。 – 2013-03-02 19:33:45

+0

你可以把這個宏放到它自己的命名空間中,然後需要從'require'的clojure文件中創建naemspace,並且需要CloijureScript文件中的'require-macro'命名空間,那麼Clojure和ClojureScript文件都可以更接近(儘管仍然不行)語言中立。 – 2013-03-04 18:41:42

2

有一些所謂的Feature Expressions實現一個通用的機制,在同一代碼庫支持的Clojure的不同變體停滯不前的工作。

3

不是一個真正的宏,但產生基於放置在你的源的元數據註解的Clojure和ClojureScript代碼Leiningen插件:cljx

+0

謝謝,我沒有注意到。 – 2013-03-05 23:47:13

相關問題