delay
содержит один результат, и вам нужно deref
, чтобы получить результат. memoize
- это несвязанный кеш, который кэширует результат в зависимости от входных аргументов . Например,
user=> (def myinc (memoize (fn [x] (println x) (inc x))))
#'user/myinc
user=> (myinc 1)
1
2
user=> (myinc 1)
2
В вашем примере (без аргументов) единственное отличие состоит в том, что вы можете использовать результат напрямую (без deref
необходимости)
Classi c сценарии использования для delay
- это вещи, которые понадобятся позже, что приведет к блокировке или задержке запуска. Или, если вы хотите «скрыть» верхний уровень def
s от компилятора (например, они вызывают побочные эффекты).
memoize
- это кэш classi c, который лучше всего использовать, если расчет это дорого, и набор входных аргументов не является чрезмерным. Есть и другие варианты кэширования в стихе clojure, которые позволяют лучше конфигурировать (например, они не связаны).