2009-07-23 6 views
7

J'ai une fonction appelée show qui affiche un dialogue avec le message. J'ai besoin de mapper cette fonction à tous les éléments dans alist. Mais Clojure ne me montre aucun message. Qu'est-ce que je fais mal?Pourquoi Clojure n'exécute-t-il pas cette fonction?

(defn show[message] 
(. javax.swing.JOptionPane (showMessageDialog nil message))) 

(defn action[] 
    (map show '(HELLO Sweet love))) 

Répondre

5

La fonction map n'exécute pas réellement la fonction mappée sur chaque membre de la collection. il renvoie plutôt une cellule 'paresseux-contre'. cela ressemble beaucoup à votre liste classique liée avec une différence très importante, les données dans chaque cellule sont calculées au moment où elle est lue et non l'heure (ce résultat est bien sûr stocké pour les lectures ultérieures). Donc, pour que la fonction fonctionne réellement, vous devez lire le résultat de l'exécution de la fonction. Parce que dans ce cas, vous ne se soucient du résultat de la fonction seulement qu'il a couru clojure fournit une grande fonction d'emballage appelé

(dorun .... insert your map here ....) 

qui va créer la carte, lire les résultats et rapidement les jeter avec en perdre la mémoire de stockage eux pour plus tard.

Si vous mappez une fonction avec les résultats que vous souhaitez conserver, utilisez plutôt doseq.

+0

Merci pour la réponse détaillée. Toutes les abstractions de liste sont-elles paresseuses? Comment puis-je savoir lesquels sont et lesquels ne le sont pas? – unj2

+0

Je crois qu'ils sont tous sauf inverse, bien que les vecteurs ont une fonction (rsec [1 2 3]) qui crée un s à partir de la fin qui résout habituellement ce problème. –

7

map est paresseux. Rien ne va être évalué avant que vous ne l'ayez forcé à être évalué. Soit (dorun (action)), soit doseq au lieu de map.

Questions connexes