J'ai vu de nombreux programmeurs Clojure enthousiastes à propos de la nouvelle bibliothèque core.async et, bien qu'elle semble très intéressante, j'ai du mal à voir comment elle se conforme aux principes Clojure, c'est pourquoi j'ai ces questions :
-
Il utilise l'état mutable partout, comme les noms des fonctions le suggèrent en ayant un point d'exclamation, comme alt !, put !, > !, et d'autres. Si vous mettez ou prenez une valeur d'un canal, ce canal est modifié sur place. N'est-ce pas contraire à la philosophie de Clojure qui préfère les structures de données immuables, les fonctions pures et ainsi de suite ? Ou est-ce que core.async est fait pour être utilisé uniquement lorsque les choses mutables ne peuvent pas être évitées du tout ?
-
Étant donné que "go" est une macro (modifiant ainsi la structure du code) et qu'il garantit que "< !" est utilisé directement dans un bloc go, il n'est pas possible d'utiliser "< !" à l'intérieur d'une autre fonction, comme ceci :
(defn take-and-print [c] (println (<! c))) (def ch (chan 1)) (>!! ch 123) (go (take-and-print ch)) Assert failed: <! used not in (go ...) block
Il me semble que cela empêche la simplicité et la composabilité. Pourquoi cela ne pose-t-il pas de problème ?
-
Peut-être en conséquence des deux problèmes précédents, beaucoup de code avec core.async utilise des constructions de plus bas niveau comme loop/recur au lieu de map/filter/reduce. N'est-ce pas un pas en arrière ?
Où est-ce que je rate le coche ?
Merci d'avance.