Я видел, как многие программисты 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. Разве это не шаг назад?
Где я упускаю главное?
Заранее спасибо.