Variables clojure何时删除变量?

Variables clojure何时删除变量?,variables,clojure,scope,memoization,Variables,Clojure,Scope,Memoization,我正在查看memoize的源代码。 来自C++/Python等语言的这一部分让我印象深刻: (let[mem(atom{})](fn[&args](如果let[e(find@mem args)]… 我意识到memoize返回一个函数,但是为了存储状态,它使用了一个局部“变量”mem。但是memoize返回函数后,外部let不应该从范围中消失。函数怎么还能引用mem 为什么Clojure不删除那个外部变量,以及它是如何管理变量名的。比如,假设我创建了另一个memoized函数,然后memoize使

我正在查看
memoize
的源代码。 来自C++/Python等语言的这一部分让我印象深刻:
(let[mem(atom{})](fn[&args](如果let[e(find@mem args)]…

我意识到
memoize
返回一个函数,但是为了存储状态,它使用了一个局部“变量”
mem
。但是
memoize
返回函数后,外部let不应该从范围中消失。函数怎么还能引用
mem

为什么Clojure不删除那个外部变量,以及它是如何管理变量名的。比如,假设我创建了另一个memoized函数,然后
memoize
使用了另一个
mem
。这个名称与前面的
mem
不冲突吗


p.S.:我想一定有很多事情发生在那里,这会阻止这种情况的发生,所以我给自己写了一个更简单的版本,它是这样的,但它仍然像
memoize

对象是垃圾收集的,如果没有线程可以访问它们,就像JVM语言通常那样ce调用由
memoize
返回的函数,并且该函数在
mem
中有一个对原子的引用,那么原子仍然可以访问

但是在memoize返回函数后,外部let不应该从作用域中消失吗?函数如何仍然引用mem

这就是所谓的a。如果函数是使用其环境中的名称定义的,则它会在以后保留对该值的引用—即使定义环境已消失,并且函数是唯一可以访问的对象

假设我做了另一个memoize函数,然后memoize使用了另一个mem。这个名字和以前的mem不冲突吗

不,除非可能会让程序员感到困惑。有多个作用域,每个作用域声明自己的名称
mem
,这是非常可能的,通常的规则用于确定读取
mem
时的含义。有一些更棘手的边缘情况,例如

(let[foo 2]
  (let[foo (fn[] foo)] ;; In the function definition, foo has the value from the outer scope
    ;; because the second let has not yet bound the name
    (foo))) ;; => 2. 
但一般来说,这个想法非常简单——名称的值是在程序文本中最接近其使用位置的定义中给出的值——无论是在局部范围内还是在最接近的外部范围内。
memoize
的不同调用会创建不同的闭包,以便名称
mem
引用每个返回函数中的不同原子。

按照JVM语言的惯例,如果没有线程可以访问对象,则对象是可垃圾回收的。如果线程引用了
memoize
返回的函数,则tion在
mem
中有一个对原子的引用,那么原子仍然可以访问

但是在memoize返回函数后,外部let不应该从作用域中消失吗?函数如何仍然引用mem

这就是所谓的a。如果函数是使用其环境中的名称定义的,则它会在以后保留对该值的引用—即使定义环境已消失,并且函数是唯一可以访问的对象

假设我做了另一个memoize函数,然后memoize使用了另一个mem。这个名字和以前的mem不冲突吗

不,除非可能会让程序员感到困惑。有多个作用域,每个作用域声明自己的名称
mem
,这是非常可能的,通常的规则用于确定读取
mem
时的含义。有一些更棘手的边缘情况,例如

(let[foo 2]
  (let[foo (fn[] foo)] ;; In the function definition, foo has the value from the outer scope
    ;; because the second let has not yet bound the name
    (foo))) ;; => 2. 
但一般来说,这个想法非常简单——名称的值是在程序文本中最接近其使用位置的定义中给出的值——无论是在局部范围内还是在最接近的外部范围内。
memoize
的不同调用会创建不同的闭包,因此名称
mem
在每个返回函数中引用不同的原子。

@Flimzy,感谢您的赞扬:D@Flimzy,谢谢你的表扬:DThanks!学到了一些新东西:Clojure中的闭包。:)以防万一!谢谢!学到了一些新东西:Clojure中的闭包。:)以防万一!