2010-06-16 106 views
6

我想將Clojure代碼嵌入到Java中。 This網站有助於設置這個基礎知識,但它唯一通過的參數是String類型。我也嘗試過使用整數,而且這些也是有效的。將參數傳遞給Java的Clojure

我的問題是,是否有一些格式化的方式將結構化數據傳遞給Clojure。特別是,我點的名單,我想傳遞給Clojure的,變成一個載體,將是這個樣子:

[[1 2] [3 4] [5 6]] 

什麼是去這樣做最簡單的方法?有沒有預處理我可以在Java的末尾做,或者我應該在Clojure的後端做後處理,還是在Clojure中有一些可以處理這個問題的東西?我懷疑它傳遞了一串數字和每個元組的長度,並讓它將字符串處理成一個向量。然而,Clojure的這方面並沒有很多例子,我很好奇,如果我錯過了一些明顯的東西。

編輯:請看mikera的答案是你有興趣傳遞Java對象。如果您只想提前將數據格式化爲Clojure格式的set/map /等,請查看下面的答案。

回答

2

這取決於您的數據以什麼格式開始,但您可能會發現最簡單的方法就是直接傳遞代表數據的Java對象並使用Clojure的Java互操作性功能來讀取它。

例如你可以直接通過點的Java數組,做類似:

(let [point (aget some-array index)] 
    (do-stuff-with-point point)) 
+0

嗯,我不完全確定我最終會想要什麼格式 - 現在大多隻是探索性的。你的解決方案肯定會最適合於對象。 – 2010-06-16 18:51:09

1

對於那些情況下,當你想在你已經格式化的樣子Clojure的Java中的一個簡單的數據結構來傳遞,你可以通過在那arg作爲一個字符串。所以對於我在我的問題中給出的例子,我會通過

"[[1 2] [3 4] [5 6]]" 

作爲我的arg。當你使用調用(ARG)稱爲Clojure的,你可以讓你的函數的第一步是readString調用您的ARG:

(defn foo [d] 
    (def data (read-string d))) 

以上會產生矢量時的例子字符串傳遞