如何改进此Clojure功能?

时间:2012-07-12 01:37:45

标签: 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"))))

如果它有所不同(我想它确实如此)我返回数据的使用特性几乎只涉及生成由同一函数返回的另一个集合的并集和交集。

2 个答案:

答案 0 :(得分:4)

当初始向量为空时,使用'vec'而不是'into'稍微简洁一点。它可以更清楚地表达意图,尽管这更多的是偏好。

(vec (map :actor_id results))

答案 1 :(得分: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)))))