Почему второй цикл вычислений бесконечно в Clojure?
butlast
не ленив, поскольку он перечисляет всю входную последовательность и создает новую коллекцию, пока не исчерпает ввод.
В обеих версиях butlast
устраняет лень в восходящем потоке, поэтому я думаю, что еще один важный вопрос: «Почему первая версия когда-либо возвращается, когда задействовано butlast
?»: take 0
не работает- он не использует входную последовательность, когда n не является положительным числом, поэтому не имеет значения, что вы передаете его.
Кроме того, я думаю, что эквивалентный код Clojure дляhead . tail $ [0..]
было бы:
(->> (range) rest first) ;; => 1
butlast
является своего рода противоположностью того, что вы хотели бы.