Сегодня у меня была идея для функции высшего порядка, которую я не знаю, как написать.У меня есть несколько редких, ленивых бесконечных последовательностей, и я хочу создать абстракцию, которая позволяет мне проверять, находится ли данное число в любой из этих ленивых последовательностей.Чтобы повысить производительность, я хотел поместить значения разреженной последовательности в хэш-карту (или установить), динамически увеличивая количество значений в хеш-карте всякий раз, когда это необходимо.Автоматическое запоминание не является ответом здесь из-за редкости ленивых последовательностей.
Вероятно, код легче понять, так что вот что я имею до сих пор.Как изменить следующий код, чтобы предикат использовал закрытую хэш-карту, но при необходимости увеличивает размер хэш-карты и переопределяет себя, чтобы использовать новую хэш-карту?
(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))))
Как мне решить эту проблемупроблема, не возвращаясь к императивному стилю?