8
votes

Clojure pour la boucle, stockez les valeurs dans un ensemble ou une carte

Celui-ci m'a dérangé depuis un moment maintenant, Comment devrions-nous stocker une valeur dans un ensemble ou une carte dans A pour boucle? XXX

Je sais que cela ne fonctionnera pas, mais je veux une fonctionnalité similaire à celle-ci, où l'ensemble contiendra enfin [ 0 0] [0 1] ... [0 9] [1 0] ... [9 9]

Merci


1 commentaires

Merci à tous, pour les réponses.


5 Réponses :


0
votes

Clojure a plusieurs excellents systèmes de gestion de l'état mutable. Dans ce cas, vous pouvez vouloir un Atom contenant un ensemble

Vos autres options sont les suivantes:

  • a ref Si plusieurs modifications doivent être apportées (coordonnées de nombreux threads)
  • a var Si cela sera uniforme (un var peut fonctionner aussi bien ici qu'un atome) < / li>
  • un agent Si vous vouliez définir la valeur de s asynchrone

    bien sûr pour retourne déjà une séquence afin que vous puissiez juste vouloir xxx


2 commentaires

Le premier extrait de code ici n'a aucun sens, autant que je puisse dire? Ce n'est pas un moyen valide d'utiliser swap! , et comme vous le mentionnez ultérieurement, ce n'est pas une bonne idée de toute façon.


Le premier Snipit n'était pas vraiment le point de la réponse, donc je viens de l'enlever. Posant des tests Tisk Tisk



14
votes

Si je comprends votre question correctement, vous devez transformer votre expression à l'envers: xxx

la chose à réaliser ici est que pour renvoie une valeur (une séquence paresseuse) contrairement à des boucles de plus langues impératives comme Java et c.


0 commentaires

6
votes

est-ce ce que vous voulez? xxx

et si vous voulez juste que la liste sous forme de jeu: xxx

vous finirez par finir avec un ensemble de paires.


0 commentaires

5
votes

généralement em> lorsque vous souhaitez renvoyer un ensemble ou une carte ou une autre "valeur unique" qui n'est pas un SEQ d'une opération généralisée "répétée" sur un SEQ, en utilisant Réduire est plus idiomatique / simple que boucle / recur code> et pour code> retourne toujours un SEQ (pas un jeu ou une carte).

(reduce + 0 (range 100))
=> 4950


0 commentaires

0
votes

Je pense que vous pouvez également utiliser une structure de données transitoire dans ce scénario.

(let [s (transient #{})]
 (for [ i (range 10)
        j (range 10) ]
  (assoc! s i j)))
(persistent! s)


1 commentaires

Ce n'est pas correct. De Les docs pour les transitoires : "Notez en particulier que les transitoires ne sont pas conçus pour être intégrés à la place. Vous devez Capturez et utilisez la valeur de retour dans l'appel suivant. De cette manière, ils supportent la même structure de code que le code persistant fonctionnel qu'ils remplacent ».