Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance memoize如何与Clojure中的绑定交互?_Performance_Clojure - Fatal编程技术网

Performance memoize如何与Clojure中的绑定交互?

Performance memoize如何与Clojure中的绑定交互?,performance,clojure,Performance,Clojure,memoize是否跟踪绑定的更改,这些更改可能导致返回存储的计算不正确 例如,如果我有一个函数foo,例如: (defn foo [bar baz] ... (let [config-val *config-val*] ...) ) 我将其包含在绑定中,以便我可以更改*config val*的值,记住它是否意味着如果我更改*config val*的值,但不更改其参数,它将不会重新计算函数的值?相反,它将为我提供具有旧配置的函数值?在Clojure 1.3.0中,memoize

memoize
是否跟踪绑定的更改,这些更改可能导致返回存储的计算不正确

例如,如果我有一个函数foo,例如:

(defn foo [bar baz]
 ...
   (let [config-val *config-val*]
    ...)
 )

我将其包含在绑定中,以便我可以更改
*config val*
的值,记住它是否意味着如果我更改
*config val*
的值,但不更改其参数,它将不会重新计算函数的值?相反,它将为我提供具有旧配置的函数值?

在Clojure 1.3.0
中,memoize
不会跟踪重新绑定

user=> (def ^:dynamic *x* 5)
#'user/*x*
user=> (def f (memoize #(+ *x* %)))
#'user/f
user=> (f 1)
6
user=> (binding [*x* 6] (f 1))
6
user=> (binding [*x* 7] (f 1))
6
另外,

user=> (binding [*x* 7] (f 3))
10
user=> (f 3)
10
user=> *x*
5

memoize
不考虑绑定,这可以通过查看原子中的映射仅由参数设置关键帧的源代码来确认。实际上,具有动态重新绑定的函数不是“引用透明的”(即不能用其值替换)

是否有什么东西阻止您将
*config val*
作为参数传递,至少传递给您希望记忆的函数


user=> (source memoize)
(defn memoize
  "Returns a memoized version of a referentially transparent function. The
  memoized version of the function keeps a cache of the mapping from arguments
  to results and, when calls with the same arguments are repeated often, has
  higher performance at the expense of higher memory use."
  {:added "1.0"}
  [f]
  (let [mem (atom {})]
    (fn [& args]
      (if-let [e (find @mem args)]
        (val e)
        (let [ret (apply f args)]
          (swap! mem assoc args ret)
          ret)))))
正如所建议的,一个记忆函数将保留一个映射到结果的参数的内部缓存。当使用已看到的参数调用memorized函数时,它只会从缓存中查找正确的返回值。不会重新计算任何内容,您将获得与上次调用该函数时相同的结果。任何重新绑定都将被忽略

user=> (def ^:dynamic op +)
user=> (defn add [x y] (op x y))
user=> (add 1 2)
3
user=> (binding [op -]
         (add 1 2))
-1
user=> (alter-var-root #'add memoize)
user=> (add 1 2)
3
user=> (binding [op -]
         (add 1 2))
3

不是真的,我只是想找出方法来重组它,我得到了一些很好的工作代码,我只是想想办法让它更快。