前几天我试图在 Clojure 中提出一个闭包的例子。我想出了我以前见过的例子,并认为它是合适的。
唉,有人告诉我这不是一个好的,我应该提供一些东西。
任何人都可以解释一下吗?
(defn pow [x n] (apply * (repeat x n)))
(defn sq [y] (pow y 2))
(defn qb [y] (pow y 3))
前几天我试图在 Clojure 中提出一个闭包的例子。我想出了我以前见过的例子,并认为它是合适的。
唉,有人告诉我这不是一个好的,我应该提供一些东西。
任何人都可以解释一下吗?
(defn pow [x n] (apply * (repeat x n)))
(defn sq [y] (pow y 2))
(defn qb [y] (pow y 3))
闭包是一个函数,它可以访问其自身范围之外的某些命名值/变量,因此在创建它时从围绕该函数的更高范围访问(这不包括函数参数和在函数内创建的局部命名值)。您的示例不符合条件,因为每个函数只使用它们自己范围内的命名值。
例子:
(def foo
(let [counter (atom 0)]
(fn [] (do (swap! counter inc) @counter))))
(foo) ;;=> 1
(foo) ;;=> 2
(foo) ;;=> 3, etc
Nowfoo
是一个函数,它返回一个超出其作用域的原子的值。因为函数仍然持有对该原子的引用,所以只要foo
需要,原子就不会被垃圾回收。
返回函数的函数,即高阶函数是闭包的好例子。
(defn pow [n]
(fn [x] (apply * (repeat n x))))
(def sq (pow 2))
(def qb (pow 3))
关闭的另一个例子。有两个函数共享相同的环境 ( state
)。
(defn create-object [init-state]
(let [state (atom init-state)]
{:getter (fn []
@state)
:setter (fn [new-val]
(reset! state new-val))}))
(defn test-it []
(let [{:keys [setter getter]} (create-object :init-value)]
(println (getter))
(setter :new-value)
(println (getter))))
(test-it)
=> :init-value
:new-value
我想要一些东西来设置每次都要使用的常量值。
(def myran
(let [constrand (rand)]
(fn [n] (* n constrand))))
(myran 3)
2.7124521745892096
(myran 1)
0.9041507248630699
(myran 3)
2.7124521745892096
这只会为“constrand”设置一次值。这是一个非常人为的示例,但我希望能够执行以下操作:
这来自:JavaScript:好的部分