Преобразование: почему этот преобразователь ничего не печатает

У меня есть следующий код, и я ожидал, что он напечатает 1,2,3,4 на консоли и вернет [true,true,true,true]. Но он просто возвращается пустым и ничего не печатает на консоли.

Логика такова: он зацикливает (0..3), inc каждый элемент на 1, поэтому я получил (1..4), затем запускаю (map (fn[x] (println x) true)), он берет 1 из ленивой последовательности, печатает 1 и возвращает true, а take-while выводит результат в [true], затем принимает следующий элемент из 2, вывести 2, вернуть [true,true] и т. д., поэтому результат должен вывести на консоль 1,2,3,4 и вернуть [true,true,true,true]. Но на самом деле он ничего не печатает и возвращает []. Это как понять?

(transduce (comp (take-while true?)
                 (map (fn[x] (println x) true))
           conj
           []
           (map inc (range 4)))

person Daniel Wu    schedule 12.12.2015    source источник


Ответы (1)


Это потому что

Композиция преобразователя выполняется справа налево, но создает стек преобразования, который применяется слева направо (в этом примере фильтрация выполняется перед отображением).

Дополнительные сведения см. здесь: http://clojure.org/transducers.

person user5187212    schedule 12.12.2015