Juste pour expliquer un peu plus, quand vous faites (swap! (:toppings order) ...)
, vous récupérez la clé de :toppings
order
, ce qui aurait du sens si c'était une carte, mais c'est un atome, alors (:toppings order)
renvoie nil
.
Le premier argument à swap!
devrait toujours être un atome (Reagent
les atomes fonctionnent de la même manière). Le deuxième argument devrait être une fonction qui prend le contenu de l'atome comme premier argument. Ensuite, vous pouvez éventuellement fournir plus d'arguments qui seront passés à l'argument de la fonction.
au lieu de la réponse de minhtuannguyen, vous pourriez faire ce qui suit:
(swap! order
(fn a [m]
(update m :toppings
(fn b [t]
(conj t "Pepperoni")))))
fn a
reçoit la carte dans l'atome, se fixe à m
, puis met à jour et retourne une nouvelle carte, qui devient la nouvelle valeur de l'atome.
Si vous voulez, vous pouvez redéfinir fn a
de prendre un second argument:
(swap! order
(fn a [m the-key]
(update m the-key
(fn b [t]
(conj t "Pepperoni"))))
:toppings)
:toppings
est maintenant passé comme second argument à fn a
, puis passé à l'intérieur de update
fn a
. Nous pourrions faire la même chose pour le troisième argument update
:
(swap! order
(fn a [m the-key the-fn]
(update m the-key the-fn))
:toppings
(fn b [t]
(conj t "Pepperoni")))
Maintenant update
a la même signature que fn a
, nous avons donc plus besoin fn a
du tout.Nous pouvons simplement fournir update
directement à la place de fn a
:
(swap! order update :toppings
(fn b [t]
(conj t "Pepperoni")))
Mais nous pouvons continuer, parce que update
accepte aussi plus d'arguments qu'il transmet ensuite à la fonction qui lui est fournie. Nous pourrions réécrire fn b
prendre un autre argument:
(swap! order update :toppings
(fn b [t the-topping]
(conj t the-topping))
"Pepperoni"))
Encore une fois, conj
a la même signature que fn b
, donc fn b
est redondant, et nous pouvons simplement utiliser conj
à sa place:
(swap! order update :toppings conj "Pepperoni")
Ainsi , on se retrouve avec la réponse de minhtuannguyen.
Toutes les réponses ci-dessous sont utiles. J'ai accepté la réponse qui répond le plus directement à la question, mais les autres offrent un meilleur aperçu de la façon de travailler avec les atomes. – jmargolisvt