2015-03-30 6 views
0

Использование datomic и clojure Я запрашиваю базу данных и получаю список из девяти элементов.заполнить список один раз

Я хотел бы нарисовать эти девять элементов на странице, и на этом этапе они гарантированно будут разными элементами.

Однако каждый раз, когда я вызываю функцию, она повторяет запрос, возвращает новый список и затем получает элемент из нового списка. Это очень неэффективно, а также вводит возможность дублирования.

Я хотел бы запомнить этот список и его n-й-индексируемый. Предложения и идеи приветствуются.

ответ

2

Вместо того, чтобы называть «функцию», вы должны только называть его, если вы еще не вызвали его. Если вы его вызываете, обязательно сохраните результат. Если вы его не назовете, найдите результат.

memoize (http://crossclj.info/fun/clojure.core/memoize.html) может помочь вам в этом. В зависимости от ваших требований к кешу, вы можете изучить его реализацию и реализовать что-то более подходящее.

Возможно, вы захотите обратиться к https://github.com/clojure/core.memoize для более сложных потребностей memoization на сервере.

Любой список n-й-индексируемый с O (n). Для производительности O (log 32 n) создайте вектор из него с помощью vec.

+0

Спасибо! В итоге я узнал о задержке http://clojuredocs.org/clojure.core/delay через канал #Clojure freenode. Когда кто-то разделяет fxn, он запускает тело один раз и кэширует результат; будущие derefs получат кешированный результат. Использование let over delay (пусть [результаты (delay (query ...))] ___ @result) помогли мне достичь того, что я хотел. Еще раз спасибо за вашу помощь – sova

+1

Задержка полезна, если функция не принимает аргументов. Я не убежден в вашем примере, что вы достигли memoization, потому что новая задержка создается каждый раз, когда вы оцениваете форму let. Обратите внимание, что я добавил ссылку на core.memoize для ответа. –

Смежные вопросы