Binding 特殊闭包用例:为什么使用闭包? 更新

Binding 特殊闭包用例:为什么使用闭包? 更新,binding,closures,environment,use-case,Binding,Closures,Environment,Use Case,我正在设计一种实验性的编程语言,问题是应该包含闭包还是只使用第一类函数。为了决定这一点,我需要现实的用例/示例来展示闭包相对于一类函数的好处。我知道,如果没有它们,您可以使用其中一个实现您可以实现的所有功能,但是对于第一类函数,有几个用例的代码更易于阅读(例如,更短或不划分为多个类)。例如: 红宝石: 如果没有第一类函数,这些示例将更加冗长,因为您必须使用循环或类似的东西 现在,哪些用例显示了闭包的有用性?尽管我经常使用第一类函数,但我确实无法为闭包提供好的用例。你有什么好的闭包用例吗 原职 我

我正在设计一种实验性的编程语言,问题是应该包含闭包还是只使用第一类函数。为了决定这一点,我需要现实的用例/示例来展示闭包相对于一类函数的好处。我知道,如果没有它们,您可以使用其中一个实现您可以实现的所有功能,但是对于第一类函数,有几个用例的代码更易于阅读(例如,更短或不划分为多个类)。例如:

红宝石:

如果没有第一类函数,这些示例将更加冗长,因为您必须使用循环或类似的东西

现在,哪些用例显示了闭包的有用性?尽管我经常使用第一类函数,但我确实无法为闭包提供好的用例。你有什么好的闭包用例吗

原职 我不明白为什么闭包绑定到变量而不仅仅是值,例如:

红宝石:

在闭包定义点引用变量而不是仅仅引用存储在变量中的值有什么用?如本例所示:

红宝石:


有没有好的用例需要在闭包定义点引用变量而不是仅仅引用这些变量的值?

闭包的整个意义在于闭包状态可以改变。可以说,关闭那些没有(或不能)改变的东西是一种糟糕的形式,因为你隐藏了一个参数

以下面的人为例子为例,用C#:

Append
关闭StringBuilder和计数器,这样我就可以通过我的代码对其进行调用,而无需每次都通过
SomethingElse
sb.Append
仪式。如果闭包中的状态无法更改,则闭包对此类事情的用处将更小。

据我所知(如果我错了,请帮助我),在lambda表达式中使用变量将变量(如“Foo as Widget”)更改为新的持有者(Widget),定义如下所示,并将对Foo的所有引用更改为对Foo.Value的引用。然后将闭合变量的保持器作为参数传递给代理工厂

Class Holder(Of T) Public Value As T Sub New(NewValue As T) Value = NewValue End Sub End Class 类别持有人(T) 公共价值论 次新值(新值为T) 值=新值 端接头 末级 我不太确定额外的一层包装到底有多有用。我认为更常见的情况是,人们希望通过值获取局部变量。在我自己的代码中,在升级到支持lambdas的VB版本之前,我使用了委托工厂,例如

Sub SetText(ByVal St As String) Text = St End Sub ... elsewhere MyControl.BeginInvoke(NewInv(AddressOf SetText, someExpression)) Sub SetText(ByVal St作为字符串) Text=St 端接头 ... 在别处 MyControl.BeginInvoke(NewInv(SetText的地址,someExpression)) 请注意,在执行BeginInvoke本身时,而不是在实际执行延迟操作时,将对someExpression求值。还要注意的是,我的NewInv()函数族支持1-4个参数的泛型重写,如果需要一个操作(of T)而不是MethodInvoker,我有一个泛型静态类和另一个函数族


顺便说一句,这种方法的一个优点是:它适用于编辑/继续。

我想你误解了我(或者我误解了你的答案:p):看看我发布的第一个示例。我给在闭包外部定义的变量x赋值。虽然此赋值发生在定义闭包之后,但闭包使用新值x(100而不是5)。为什么闭包不在定义闭包的点上使用分配给x的值?@Rampaanir,因为这就是闭包的整个点!如果它使用变量定义时的值,那么它的含义与参数相同。如果这是您想要的行为,请将值作为参数传递,而不是关闭变量。@DDaviesBrackett:我看不出这与参数有什么相同之处。在我看来,它就像一个常量,因为在调用闭包时不能替换该值。但参数可以在每次调用时传递。不使用参数的原因是您必须在每次调用时传递参数。但是,在哪些用例中,您需要闭包来识别定义闭包后对变量的重新分配?在您的示例中,我认为这(仅)用于计数器变量。这种行为可能是针对不可变值(如int)的吗?@Rampaanir:DDaviesBrackett是正确的——捕获(即关闭)变量是关闭的关键。听起来你真正想要的是,有时被称为,有时被称为。@Daniel Pryden:我的第一条评论表述错误,对不起。我知道结束变量是结束点。这就是为什么我更新了我的问题:有两种类型的闭包:一种是更容易实现的闭包类型,它关闭变量而不跟踪对变量的重新分配;另一种是更难实现的闭包类型,它跟踪对闭包中使用的变量的重新分配,即使在定义闭包之后。后者的目的是什么?在prog中包含这种类型的闭包是否值得。语言?
x = 5
l = lambda { x }
l.call #=> 5
x = 100
l.call #=> 5, not 100
var sb=new StringBuilder();
int counter = 0;
var Append=(int a, string s)=>
            sb.Append(a*a + counter++, SomethingElse(s, "some constant"));
Class Holder(Of T) Public Value As T Sub New(NewValue As T) Value = NewValue End Sub End Class Sub SetText(ByVal St As String) Text = St End Sub ... elsewhere MyControl.BeginInvoke(NewInv(AddressOf SetText, someExpression))