Un petit pb de syntaxe

20 views
Skip to first unread message

Cédric Pineau

unread,
Aug 6, 2014, 10:48:34 AM8/6/14
to cloju...@googlegroups.com

 Bonjour tous,

 Une petite question que je suppute simple.
 J'arrive à mapper une transformation d'une map en une autre sur une liste de map de la manière suivante :

(def li [{:q "q1" :r 1} {:q "q2" :r 2} {:q "q3" :r 3}])

(for [i li]
  {(->> i :q) (->> i :r)}
  )
=> ({"q1" 1} {"q2" 2} {"q3" 3})

ou comme cela
(map (fn [i] {(->> i :q) (->> i :r)}) li)
=> idem

mais pas de cette manière..
(map #({(->> % :q) (->> % :r)}) li)
=> clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentArrayMap


 Pourquoi ??

 Question supplémentaire pour les forts en thème : Y a t'il une meilleure approche pour le faire ?


--
Cédric

Jérôme Prudent

unread,
Aug 6, 2014, 11:08:00 AM8/6/14
to cloju...@googlegroups.com
Salut,

Le premier élément de #() doit être un symbole qui s'évalue comme une fonction. Dans ton cas, c'est une map. Une map s'évalue aussi comme une fonction mais prend en paramètre la clé à rechercher. D'où le Wrong number of args (0).

Voici comment je ferais :

user=> (map (fn [m] {(m :q) (m :r)}) li)

({"q1" 1} {"q2" 2} {"q3" 3})

ou si vraiment tu veux utiliser #() :

user=> (map #(into {} {(% :q) (% :r)}) li)

({"q1" 1} {"q2" 2} {"q3" 3})

--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "clojure-fr".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse clojure-fr+...@googlegroups.com.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.



--
(Jérôme Prudent)

Christophe Grand

unread,
Aug 6, 2014, 11:10:51 AM8/6/14
to clojure-fr
use the for luke

(for [{:keys [q r]} li] {q r})

On Clojure http://clj-me.cgrand.net/
Clojure Programming http://clojurebook.com
Training, Consulting & Contracting http://lambdanext.eu/

Julien Eluard

unread,
Aug 6, 2014, 11:14:56 AM8/6/14
to cloju...@googlegroups.com
Salut Cédric,

tu peux aussi encapsuler ta map dans un appel à `do` et utiliser les keyword comme fonctions:

(map #(do {(:q %) (:r %)}) li)

Julien

Cédric Pineau

unread,
Aug 6, 2014, 11:31:00 AM8/6/14
to cloju...@googlegroups.com


 Merci pour toutes ces solutions. Les clojuristes ne prennent donc pas de congés  :-) ??

 L'usage du do me parait un peu abusé, non ? Mais ça fonctionne.
 J'aime bien le into.
 Et encore davantage le joli le destructuring via keys que je ne connaissais pas (ou plus)

 (Et pour ceux qui se demandaient ce que faisaient les ->>, c'était un oubli dans mon exemple, donc mon code je threadais plusieurs transfos à ces endroits..)

 Cédric
 
 
 


Cédric

Christophe Grand

unread,
Aug 6, 2014, 11:41:19 AM8/6/14
to clojure-fr
je répondais à Jérôme et avais trop vite lu le message de Cédric qui utilise déjà le for

(map (fn [{:keys [q r]}] {q r}) li)

ou :-)

(map (comp (partial conj {}) (juxt :q :r)) li)

perso je préfère le for ou le map+destructuring
 

Cédric Pineau

unread,
Aug 6, 2014, 11:51:31 AM8/6/14
to cloju...@googlegroups.com
Le 6 août 2014 17:41, Christophe Grand <chris...@cgrand.net> a écrit :

(map (comp (partial conj {}) (juxt :q :r)) li)
 

 Ouch ! Ca ça cogne !
 C'est la version prestataire de service : "Vous me rappellerez vous verrez" ;-)

 
--
Cédric

Laurent PETIT

unread,
Aug 7, 2014, 6:28:12 AM8/7/14
to cloju...@googlegroups.com
Quoi, encore aucune solution utilisant les transducers ? ;-)
--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "clojure-fr".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse clojure-fr+...@googlegroups.com.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.


--
Laurent Petit

Reply all
Reply to author
Forward
0 new messages