gpt4 book ai didi

macros - 仅当参数从上次调用更改时才执行函数体的函数/宏

转载 作者:行者123 更新时间:2023-12-05 09:23:03 29 4
gpt4 key购买 nike

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

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

  • 第一次调用时,它应该调用原始函数,并向它传递参数
  • 记住:参数,返回值
  • 第二次调用时
    • 具有相同的参数:它应该返回内存的返回值
    • 使用不同的参数:忘记最后的参数和返回值,调用原始函数,记住当前的参数和返回值
  • 第 n 次调用时,始终将参数与上次调用进行比较,并按上述方式进行操作。

最佳答案

修改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))

但是,已经有一个灵活的内存库可以做到这一点。

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

(defn foo [x] (println "called foo") x)
(def memo-foo (memo/lru foo :lru/threshold 1))

(memo-foo 1)
; called foo
; 1
(memo-foo 1)
; 1
(memo-foo 2)
; called foo
; 2
(memo-foo 1)
; called foo
; 1

关于macros - 仅当参数从上次调用更改时才执行函数体的函数/宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24310218/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com