scheme - 方案/ Racket 中关闭的目的是什么?

标签 scheme closures racket

我正在学习Scheme,刚刚遇到了Closures。下面提供了示例,演示了闭包的使用:

(define (create-closure x)
    (lambda () x))

(define val (create-closure 10))

据我了解,当计算上述代码时,val 将等于10。我意识到这只是一个例子,但我不明白闭包有什么帮助。有什么优势以及需要这种概念的场景是什么?

最佳答案

val不是10但一个关闭。如果你这样调用它 (val)它返回值 xx是一个闭包变量,由于仍在使用中,因此仍然存在。一个更好的例子是这样的:

(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/

相关文章:

flutter - dart 中的词法作用域是什么?

scheme - 是否有一种速记方法来更新 Racket 中的特定结构字段?

scheme - SICP练习1.5和1.6

在Scheme中使用DCG进行解析(没有Prolog)?

programming-languages - 最小的 LISP?

scheme - 如何检查我的列表以查看它是否仅包含一个值或多个值?

swift - 为什么我必须解开一个软弱的 self ?

Javascript 闭包——变量与参数

scheme - + : expects type <number> as 2nd argument, 给定:#<void>;

scheme - 方案中的连续传递风格?