Сегодня у меня возникла идея функции высшего порядка, которую я не знаю, как писать. У меня есть несколько разреженных ленивых бесконечных последовательностей, и я хочу создать абстракцию, которая позволяет мне проверять, входит ли данное число в какую-либо из этих ленивых последовательностей. Чтобы повысить производительность, я хотел поместить значения разреженной последовательности в хэш-карту (или набор), динамически увеличивая количество значений в хеш-карте всякий раз, когда это необходимо. Автоматическая запоминание здесь не решение из-за редкости ленивых последовательностей.
Вероятно, код легче всего понять, так что вот что у меня есть. Как изменить следующий код, чтобы предикат использовал закрытый хэш-карту, но при необходимости увеличивал размер хэш-карты и переопределял себя для использования нового хеш-карты?
(defn make-lazy-predicate [coll]
"Returns a predicate that returns true or false if a number is in
coll. Coll must be an ordered, increasing lazy seq of numbers."
(let [in-lazy-list? (fn [n coll top cache]
(if (> top n)
(not (nil? (cache n)))
(recur n (next coll) (first coll)
(conj cache (first coll)))]
(fn [n] (in-lazy-list? n coll (first coll) (sorted-set)))))
(def my-lazy-list (iterate #(+ % 100) 1))
(let [in-my-list? (make-lazy-predicate my-lazy-list)]
(doall (filter in-my-list? (range 10000))))
Как мне решить эту проблему, не возвращаясь к императивному стилю?