Я читаю Clojure книгу программирования О'Рейли..
Я придумал пример удержания головы.
В первом примере сохраняется ссылка на d
(я полагаю), поэтому он не получает собранный мусор:
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count d) (count t)])
;= #<OutOfMemoryError java.lang.OutOfMemoryError: Java heap space>
В то время как второй пример не сохраняет его, поэтому без проблем:
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count t) (count d)])
;= [12 99999988]
То, что я не получаю, - это то, что именно сохраняется в этом случае и почему.
Если я попытаюсь вернуть только [(count d)]
, вот так:
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count d)])
похоже, создает такую же проблему памяти.
Кроме того, я помню, что читал, что count
в каждом случае реализует/оценивает последовательность.
Поэтому мне это нужно уточнить.
Если я попытаюсь вернуть (count t)
во-первых, как это будет быстрее/больше памяти, тогда, если я вообще не верну его?
И что и зачем в этом случае сохраняется?