函数/宏仅在参数从上次调用更改时才执行函数体

skr*_*rat 2 macros functional-programming clojure clojurescript

这应该类似memoize,但非常不同.虽然memoize应该与纯函数一起使用,但加速IO相关函数通常很有用.

我正在寻找的函数/宏应该表现得像高阶函数.它产生的功能应该:

  • 当第一次调用时,它应该调用原始函数,将参数传递给它
  • 记住:参数,返回值
  • 当第二次被叫时
    • 使用相同的参数:它应该返回memoized返回值
    • 使用不同的参数:忘记最后的参数并返回值,调用原始函数,记住当前参数和返回值
  • 当第n次调用时,总是将参数与最后一次调用进行比较,并且行为如上所述.

A. *_*ebb 7

修改memoize执行此操作的源代码很容易.

(defn memo-one [f]
  (let [mem (atom {})]
    (fn [& args]
      (if-let [e (find @mem args)]
        (val e)
        (let [ret (apply f args)]
          (reset! mem {args ret})
          ret)))))

(defn foo [x] (println "called foo") x)
(def memo-foo (memo-one foo))
Run Code Online (Sandbox Code Playgroud)

但是,已经有一个灵活的memoization库可以做到这一点.

(require '[clojure.core.memoize :as memo])

(defn foo [x] (println "called foo") x)
(def memo-foo (memo/lru foo :lru/threshold 1))
Run Code Online (Sandbox Code Playgroud)
(memo-foo 1)
; called foo
; 1
(memo-foo 1)
; 1
(memo-foo 2)
; called foo
; 2  
(memo-foo 1)
; called foo
; 1
Run Code Online (Sandbox Code Playgroud)