2012-07-12 32 views
3

我剛剛寫了我的第一個Clojure函數,它基於我對語言非常有限的知識。我會喜歡一些關於性能和類型使用的反饋。例如,如果我應該使用列表或向量,我不確定 。我該如何改進這種Clojure功能?

(defn actor-ids-for-subject-id [subject-id] 
    (sql/with-connection (System/getenv "DATABASE_URL") 
    (sql/with-query-results results 
     ["SELECT actor_id FROM entries WHERE subject_id = ?" subject-id] 
     (let [res (into [] results)] 
     (map (fn [row] (get row :actor_id)) res))))) 

它通過下面的測試(給予適當的種子數據):

(deftest test-actor-ids-for-subject-id 
    (is (= ["123" "321"] (actor-ids-for-subject-id "123")))) 

如果它的確與衆不同(和我想象它)返回的數據我的使用特性將幾乎全部涉及產生由同一個函數返回的另一個集合的並集和交集。

回答

4

這是稍微更簡潔使用「VEC」而不是「到」當初始向量是空的。它可能會更清楚地表達意圖,儘管這更偏向於偏好。

(vec (map :actor_id results)) 
+0

這太棒了!非常簡潔。 – bloudermilk 2012-07-12 18:47:54

2

resultsclojure.lang.Cons,是懶序列,由clojure.java.jdbc/resultset-seq返回。每個記錄是map

(defn actor-ids-for-subject-id [subject-id] 
    (sql/with-connection (System/getenv "DATABASE_URL") 
    (sql/with-query-results results 
     ["SELECT actor_id FROM entries WHERE subject_id = ?" subject-id] 
     (into [] (map :actor_id results))))) 
+0

您選擇返回向量而不是列表的任何原因? – bloudermilk 2012-07-12 02:18:30

+0

矢量比列表好,不需要引用,推薦它。 – 2012-07-12 02:36:10

+1

這主要是文字的論點。對於生成的任何內容,這並不重要。將某些東西轉換爲矢量的唯一原因是當您需要矢量的特定特徵時。在這種情況下,它是過時的優化。 – kotarak 2012-07-12 06:00:05