Как в Clojure обрабатывают коллекции, как в потоках Java - одну за другой через все функции вместо оценки всех элементов во всем кадре стека.Также я бы описал это как каналы Unix (следующая программа извлекает фрагмент за фрагментом из предыдущего).
Вот простой пример от ClojureDocs.org
;; Use of `->` (the "thread-first" macro) can help make code ;; more readable by removing nesting. It can be especially ;; useful when using host methods: ;; Arguably a bit cumbersome to read: user=> (first (.split (.replace (.toUpperCase "a b c d") "A" "X") " ")) "X" ;; Perhaps easier to read: user=> (-> "a b c d" .toUpperCase (.replace "A" "X") (.split " ") first) "X"
Как всегда, не забудьте Clojure CheatSheet или Clojure дляХрабрый и Истинный .
Насколько я понимаю ваш вопрос, вы можете рассмотреть две вещи.
Во-первых, понять абстракцию последовательности .Это способ просмотра коллекций, который потребляет их одну за другой и лениво .Это важная идиома Clojure, и вы встретите такие хорошо известные функции, как map, filter, reduce и многие другие.Также будет важен макрос ->>, который уже упоминался в комментарии.
map
filter
reduce
->>
После этого, когда вы хотите копать глубже, вы, вероятно, захотите заглянуть в преобразователи и * 1016 редукторы *.В упрощенно упрощенном виде они позволяют объединить несколько ленивых функций в одну функцию, а затем обрабатывать коллекцию с меньшим количеством лени, меньшим потреблением памяти, большей производительностью и, возможно, в нескольких потоках.Я считаю, что это сложные темы.Возможно, последовательности уже соответствуют тому, что вы искали.