2012-07-12 3 views
3

Je viens d'écrire ma première fonction Clojure basée sur ma connaissance très limitée de la langue. J'aimerais avoir des commentaires sur la performance et l'utilisation des types. Par exemple, je ne suis pas sûr si je devrais utiliser des listes ou des vecteurs.Comment puis-je améliorer cette fonction 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))))) 

Il passe le test suivant (données de données de semences appropriées):

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

Si cela fait une différence (et je pense qu'il fait) mes caractéristiques d'utilisation des données renvoyées concerneront presque exclusivement la génération l'union et l'intersection d'un autre ensemble retourné par la même fonction.

Répondre

4

il est un peu plus concise à utiliser « VEC » au lieu de « dans » lorsque le vecteur initial est vide. il peut exprimer l'intention plus clairement, bien que ce soit plus une question de préférence.

(vec (map :actor_id results)) 
+0

C'est génial! Très concis. – bloudermilk

2

le results est un clojure.lang.Cons, est une séquence paresseuse, retour par clojure.java.jdbc/resultset-seq. chaque enregistrement est un 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

Avez-vous choisi de renvoyer un vecteur au lieu d'une liste? – bloudermilk

+0

vecteur est mieux que la liste, pas besoin de citation, le recommande. –

+1

Ceci est principalement un argument pour les littéraux. Pour tout ce qui est généré, cela n'a pas vraiment d'importance. La seule raison de convertir quelque chose en vecteur est quand vous avez besoin des caractéristiques spécifiques d'un vecteur. Dans ce cas, il s'agit d'une optimisation pré-mature. – kotarak

Questions connexes