当前位置: 首页 > 知识库问答 >
问题:

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

萧和同
2023-03-14

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

    null

共有1个答案

淳于嘉树
2023-03-14

修改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
 类似资料:
  • 问题内容: 这似乎是一个愚蠢的问题,但是此函数是否会实际影响变量(我将如何使用此变量的上下文更大,但这基本上是我不确定的问题)?(我专门问有关java) 问题答案: 考虑一个稍微不同的示例: 运行该程序的输出为: 该变量将更改为true,但是一旦方法返回,该参数变量就会消失(这就是人们所说的“超出范围”的意思)。但是,传递给方法的变量保持不变。

  • 本文向大家介绍实现一个once函数,传入函数参数只执行一次相关面试题,主要包含被问及实现一个once函数,传入函数参数只执行一次时的应答技巧和注意事项,需要的朋友参考一下 参考回答:  

  • 我正在使用Azure函数V1 c#。我有一个时间触发的azure函数,它每秒都在检查我的数据库中的一些数据。如果找到了数据,我想对它执行一些操作。此操作可能需要30秒到5分钟的时间,具体取决于其上发生的操作。 > 当我的时间触发函数获取数据并开始对其执行操作时。在第一个操作完成之前,时间触发的函数不会再次执行。因此,即使时间触发函数被安排为每秒执行一次,如果上一次迭代中的操作花费了 30 秒,则在

  • 嗨,我正在尝试从移动后端调用lambda函数。 我已经使用生成了Lambda函数。网芯 这调用很好,在. net core和AWS控制台中没有任何错误。 但当我试图从Android Studio调用它时,我得到了以下错误。 Java代码, 接口:

  • 我覆盖了LoginController中的函数登录。默认情况下,她在特质:照亮\基金会\认证\认证用户; Laravel中LoginController中的此函数必须采用类型为\Illumate\Http\Request的参数。 如果我在提交403表时在自定义请求错误中更改此参数|禁止 使用composer创建的请求: php artisan make:请求StoreBlogPost 我能在这里做

  • 问题内容: 对于我的wordpress网站php文件之一,我具有以下代码: 因此,它将把文件调用到该部分。 但是,我要使其仅在单击选项卡时执行或调用。 调用或执行该函数的jQuery是什么? 编辑: 因此,我想要实现的目标类似于Ajax。由于在单击选项卡之前不会调用该函数,因此浏览器不必调用不必要的文件并降低页面速度。 让我知道您是否认为这是最好的方法。 谢谢! 问题答案: 尽管拉斐尔(Rapha