我正在学习Scheme,刚刚遇到了Closures。下面提供了示例,演示了闭包的使用:
(define (create-closure x)
(lambda () x))
(define val (create-closure 10))
据我了解,当计算上述代码时,val
将等于10
。我意识到这只是一个例子,但我不明白闭包有什么帮助。有什么优势以及需要这种概念的场景是什么?
最佳答案
val
不是10
但一个关闭。如果你这样调用它 (val)
它返回值 x
。 x
是一个闭包变量,由于仍在使用中,因此仍然存在。一个更好的例子是这样的:
(define (larger-than-predicate n)
(lambda (v) (> v n )))
(filter (larger-than-predicate 5) '(1 2 3 4 5 6 7 8 9 10))
; ==> (6 7 8 9 10)
因此谓词将参数与 v
进行比较这是一个仍然保留 5
的变量。在动态绑定(bind) Lisp 中这是不可能的,因为 n
当比较发生时将不存在。
Algol 和 Scheme 中引入了 Lecical 作用域。 JavaScript、PHP 和 C# 都是 algol 方言,并且都是从那里继承的。 Scheme 是第一个获得它的 Lisp,Common Lisp 紧随其后。这实际上是最常见的范围界定。
关于scheme - 方案/ Racket 中关闭的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43021136/