Manupulation de LazySeq

10 views
Skip to first unread message

Benoit Picaud

unread,
Aug 30, 2014, 11:15:52 AM8/30/14
to cloju...@googlegroups.com


Bonjour la liste, 

j'ai une question qui me travaille et je viens chercher un peu d'aide ici. 

J'ai une fonction qui parse une page html avec cgrand/enlive et qui sort une lazy seq avec les éléments trouvés. Et cela marche: 

(defn page->tags
  [page]
  (filter (comp not nil?) 
          (map :content 
               (-> page 
                   (html/select [:span#tags]) 
                   first 
                   :content)))

=> (("coffee") ("chocolate"))

C'est une lazy seq qui contient des lazy seq visiblement: 

(type (page->taglist mypage))
=> clojure.lang.LazySeq
(type (first (page->taglist mypage)))
=> clojure.lang.LazySeq

Du coup si je veux faire un into #{} j'obtiens 

=> #{("coffee") ("chocolate")}
au lieu de #{"coffee" "chocolate"} que j'espère. 

(type (first (into #{}  (page->taglist mypage))))
clojure.lang.LazySeq

Je me doute qu'il faut faire un coup de apply quelque chose ou défaire la lazyness de map dans la fonction originale mais je patauge encore un peu. 

Est-ce qu'une personne aurait une idée ? 
Merci ! 

 -- Ben 

Hiram Madelaine

unread,
Aug 30, 2014, 12:08:04 PM8/30/14
to cloju...@googlegroups.com
Bonjour Benoit,

Tu peux essayer d'appeler la fonction :
flatten
Sur ton résultat 
(flatten '(("coffee") ("chocolate")))
Tu devrais obtenir :
 ("coffee" "chocolate")

Envoyé de mon iPhone
--
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.

Ben

unread,
Aug 30, 2014, 12:55:43 PM8/30/14
to cloju...@googlegroups.com

Merci Hiram, c'était bien flatten qui me manquait ! 
Splendide, 

bien à toi, 

 -- Ben 

Laurent PETIT

unread,
Aug 30, 2014, 5:13:41 PM8/30/14
to cloju...@googlegroups.com
Bonsoir, 

sinon, dans ta fonction page->tags, tu dois pouvoir utiliser mapcat au lieu de map, ça te renvoie directement le résultat concaténé: 

user=> (map reverse [[4 3 2 1 0] [8 7 6 5]])
((0 1 2 3 4) (5 6 7 8))

versus

user=> (mapcat reverse [[4 3 2 1 0] [8 7 6 5]])
(0 1 2 3 4 5 6 7 8)

et ça gérera également automatiquement les listes vides/nil : 

user=> (mapcat reverse [[4 3 2 1 0] nil [8 7 6 5]])
(0 1 2 3 4 5 6 7 8)



Laurent Petit

Ben

unread,
Aug 30, 2014, 5:17:19 PM8/30/14
to cloju...@googlegroups.com

Merci Laurent, je m'en veux un peu car j'étais passé sur la page de mapcat sur la cheatsheet et cljdocs et je n'avais pas réalisé que cela pouvait remplir toutes les conditions. 

Je suis en train de ré-écrire cette fonction ainsi et c'est en effet plus succint et clair. 


 -- Ben 

Khalid Jebbari

unread,
Aug 30, 2014, 5:41:38 PM8/30/14
to cloju...@googlegroups.com
Il y a toujours la fonction qu'il faut dans Clojure. Merci Laurent !

Christophe Grand

unread,
Aug 30, 2014, 5:48:23 PM8/30/14
to cloju...@googlegroups.com
Ou alors tu utilises la fonction enlive qui renvoie la valeur texte d'un nœud (je crois qu'elle existe mais je le souviens plus du nom — on ne se moque pas dans le fond!)
On Clojure http://clj-me.cgrand.net/
Clojure Programming http://clojurebook.com
Training, Consulting & Contracting http://lambdanext.eu/

Reply all
Reply to author
Forward
0 new messages