Clojure闭包

Clojure闭包,clojure,Clojure,前几天,我试图在Clojure提出一个关闭的例子。我想出了一个我以前见过的例子,认为这是合适的 唉,有人告诉我这不是一个好主意,我应该提供一些东西 有人能解释一下吗 (defn pow [x n] (apply * (repeat x n))) (defn sq [y] (pow y 2)) (defn qb [y] (pow y 3)) 返回函数(即高阶函数)的函数是闭包的好例子 (defn pow [n] (fn [x] (apply * (repeat n x)))) (def

前几天,我试图在Clojure提出一个关闭的例子。我想出了一个我以前见过的例子,认为这是合适的

唉,有人告诉我这不是一个好主意,我应该提供一些东西

有人能解释一下吗

(defn pow [x n] (apply * (repeat x n)))
(defn sq [y] (pow y 2))
(defn qb [y] (pow y 3))

返回函数(即高阶函数)的函数是闭包的好例子

(defn pow [n]
   (fn [x] (apply * (repeat n x))))

(def sq (pow 2))
(def qb (pow 3))

闭包是一个函数,它可以访问其自身范围之外的某些命名值/变量,因此在创建闭包时可以从围绕该函数的更高范围访问(这不包括函数参数和在函数内创建的局部命名值)。您的示例不符合条件,因为每个函数都只使用它们自己作用域中的命名值

例如:

(def foo 
  (let [counter (atom 0)]
    (fn [] (do (swap! counter inc) @counter))))

(foo) ;;=> 1
(foo) ;;=> 2
(foo) ;;=> 3, etc

现在,
foo
是一个函数,返回超出其作用域的原子的值。因为函数仍然持有对该原子的引用,所以只要需要
foo
,原子就不会被垃圾收集。

另一个闭包示例。有两个函数共享相同的环境(
state


我想有一些设置常量值的东西,每次都要使用

(def myran 
  (let [constrand (rand)]
    (fn [n] (* n constrand))))


(myran 3)
2.7124521745892096
(myran 1)
0.9041507248630699
(myran 3)
2.7124521745892096
这将只为“constrand”设置一次值。这是一个非常做作的例子,但我希望能够做到以下几点:


这来自:

Hi,如果我像你一样定义了我的pow的主体,那么我的示例将是一个闭包(闭包是anon f)?是的,这将是描述闭包的一种方式
(def myran 
  (let [constrand (rand)]
    (fn [n] (* n constrand))))


(myran 3)
2.7124521745892096
(myran 1)
0.9041507248630699
(myran 3)
2.7124521745892096