Я видел много программистов Clojure, энтузиастов по поводу новой библиотеки core.async и, хотя мне кажется очень интересным, мне нелегко видеть, как она соответствует принципам Clojure, поэтому у меня есть следующие вопросы:
- Он использует изменяемое состояние везде, так как названия функций предполагают наличие восклицательного знака, например alt!, put!, > !, и другие. Если вы поместите или возьмите значение из канала, этот канал будет изменен на место. Разве это не противоречит философии Clojure, предпочитающей неизменные структуры данных, чистые функции и т.д.? Или core.async используется для использования только там, где вообще невозможно избежать изменчивых вещей?
-
Так как "go" представляет собой макрос (таким образом, изменяя структуру кода) и обеспечивает "<!" используется непосредственно в блоке go, невозможно использовать "<!" внутри другой функции, например:
(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
Мне кажется, что это предотвращает простоту и удобство. Почему это не проблема?
-
Возможно, из-за предыдущих двух проблем много кода с core.async использует конструкции нижнего уровня, такие как loop/recur вместо map/filter/reduce. Разве это не шаг назад?
Где я пропущу точку?
Спасибо заранее.