这是封闭吗?

时间:2011-04-03 09:40:44

标签: lisp closures

有些人声称下面的代码是Lisp中闭包的一个例子。我不熟悉Lisp,但相信他错了。我没有看到任何自由变量,在我看来它是普通高级函数的一个例子。你能否判断......

 (defun func (callback)
   callback()
)

(defun f1() 1)
(defun f1() 2)

func(f1)
func(f2)

2 个答案:

答案 0 :(得分:17)

没有

func内没有定义将func内的局部变量括起来的函数。 这是一个基于你的实用例子这是一个很好的例子:

输入:

(define f 
  (lambda (first-word last-word) 
    (lambda (middle-word)
      (string-append first-word middle-word last-word))))

(define f1 (f "The" "cat."))
(define f2 (f "My" "adventure."))

(f1 " black ")
(f1 " sneaky ")

(f2 " dangerous ")
(f2 " dreadful ")

输出:

Welcome to DrScheme, version 4.1.3 [3m].
Language: Pretty Big; memory limit: 128 megabytes.
"The black cat."
"The sneaky cat."
"My dangerous adventure."
"My dreadful adventure."
> 

f定义并返回一个闭包,其中第一个和最后一个单词是封闭的,然后通过调用新创建的函数重用它们{ {1}}和f1


这篇文章有几百个视图,因此如果非计划者正在阅读这个,这里是python中同样愚蠢的例子:

f2

答案 1 :(得分:0)

这是我作为JavaScript程序员的贡献:

闭包是一个可以访问其词法范围中定义的变量的函数(在实际调用闭包时可能不再存在的范围)。这里:

function funktionFactory(context) {
   // this is the lexical scope of the following anonymous function
   return function() {
      // do things with context
   }
}

一旦funktionFactory返回,词法范围就会永远消失但是如果返回的函数仍然被引用(并且因此没有被垃圾回收),那么它就是一个很大的'但是',那么这样的函数(一个闭包)可以仍然使用原始变量context。这里:

var closure = funktionFactory({
   name: "foo"
});

除了closure之外,没有人可以访问上下文对象的name属性(当funktionFactory返回时,软件中的任何其他实体都无法访问)。

那么回答你的问题:func关闭了吗?不。 callback?既不!