Вы не получаете ленивую последовательность в этой ситуации.
Это по разным причинам:
- Вы строите карту.Карты не ленивые, только последовательности.
- Большинство ваших функций написаны с использованием цикла / повторения, которые по своей сути являются императивными и не ленивыми.
- Стоит также отметить, что vec , уменьшение и count также не ленивы, в том смысле, что они должны потреблять весь вводпоследовательность.Поэтому всякий раз, когда вы используете эти функции, вся ваша последовательность будет реализована, и вы потеряете преимущество лени.
Если вы хотите использовать ленивую последовательность в Clojure, обычно проще всего написать код в терминахфункций высшего порядка, которые производят последовательности, такие как map и filter .Большинство функций, производящих последовательности, по умолчанию создают ленивые последовательности.
Конечно, вы можете заключить в lazy-seq , если хотите создать ленивую последовательность, но для этого требуется следующее:
- Ваш вывод должен быть в форме последовательности
- У вас есть способ лениво построить свой вывод без осознания полного результата (в противном случае использование lazy-seq довольно бессмысленно)...)
Классическим использованием lazy-seq было бы использование некоторых функций и рекурсии более высокого порядка для определения (возможно бесконечной) ленивой последовательности, например, следующим образом:
(def fibs (concat [1 2] (lazy-seq (map + fibs (next fibs)))))