Manupulation de LazySeq

10 kali dilihat
Langsung ke pesan pertama yang belum dibaca

Benoit Picaud

belum dibaca,
30 Agu 2014, 11.15.5230/08/14
kepadacloju...@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

belum dibaca,
30 Agu 2014, 12.08.0430/08/14
kepadacloju...@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

belum dibaca,
30 Agu 2014, 12.55.4330/08/14
kepadacloju...@googlegroups.com

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

bien à toi, 

 -- Ben 

Laurent PETIT

belum dibaca,
30 Agu 2014, 17.13.4130/08/14
kepadacloju...@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

belum dibaca,
30 Agu 2014, 17.17.1930/08/14
kepadacloju...@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

belum dibaca,
30 Agu 2014, 17.41.3830/08/14
kepadacloju...@googlegroups.com
Il y a toujours la fonction qu'il faut dans Clojure. Merci Laurent !

Christophe Grand

belum dibaca,
30 Agu 2014, 17.48.2330/08/14
kepadacloju...@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/

Balas ke semua
Balas ke penulis
Teruskan
0 pesan baru