2011-02-07 102 views
21

我寫了一個小的匿名函數用於調用map。該函數從SQL結果集查詢中返回一個包含列名和列值的向量。Clojure:從一個匿名函數返回一個向量

下面是函數(輸入爲列名):

(fn [name] [(keyword name) (.getObject resultset name)]) 

這工作得很好,但是當我試圖用匿名函數的「簡化」版本,我得到了一個錯誤:

#([(keyword %) (.getObject resultset %)]) 

java.lang.IllegalArgumentException: Wrong number of args (0) passed to: PersistentVector 

這裏是map電話:

(into {} (map (fn [name] [(keyword name) (.getObject resultset name)]) column-names)) 

是否有可能使用SIMPL ified這個函數的語法?如果是這樣,怎麼樣?

謝謝。

+0

一些詳細信息:http://groups.google.com/group/clojure/browse_thread/thread/9037f31748cef0e2/62d3f3a45a139157?lnk=gst&q= Nick + Zbinden#62d3f3a45a139157 – nickik 2011-02-07 13:26:04

回答

24

你的問題是,簡單的語法試圖將矢量作爲函數調用來評估。

您可以插入一個「身份」的功能,使其工作,因爲這僅僅是一個簡單的函數,將返回向量不變:

#(identity [(keyword %) (.getObject resultset %)]) 
+0

我選擇了這個答案,因爲它也解釋了爲什麼會出現這個問題,儘管Alex Ott的回答也可以工作(併爲其他數據結構提供了一個通用解決方案)。謝謝,所有。 – Ralph 2011-02-07 13:20:16

+0

我編輯了這個答案,以納入亞歷克斯的建議,但它看起來像是由於某種原因被忽略。好吧。 – apg 2011-02-07 18:07:46

23

您需要使用矢量功能來做到這一點:

#(vector (keyword %) (.getObject resultset %)) 

PS也有地圖,集等功能。

4

是的,Clojure應該真的支持一個#[...]結構,只是爲了這種情況。

我會建議以下爲最佳的選擇:

#(vector (keyword %) (.getObject resultset %))