在编程语言中,闭包是一种流行且经常需要的功能。维基百科说(强调我的):
在计算机科学中,闭包(...)是一个函数,以及对该函数的非局部变量的引用环境。闭包允许函数访问其直接词法范围之外的变量。
因此,闭包本质上是一个(匿名?)函数值,可以使用超出其自身范围的变量。以我的经验,这意味着它可以访问定义点范围内的变量。
实际上,至少在函数式编程之外,这个概念似乎有所不同。不同的语言实现了不同的语义,甚至似乎还有意见之战。许多程序员似乎不知道闭包是什么,只把它们看作是匿名函数。
同样,在实现闭包时似乎存在主要障碍。最值得注意的是,Java 7本应包含它们,但该功能已推回将来的版本。
为什么闭包这么难(难以理解和实现)?这个问题过于笼统和含糊不清,因此让我将重点放在这些相互关联的问题上:
- 在常见的语义形式主义(小步骤,大步骤等)中表达闭包是否存在问题?
- 现有的类型系统是否不适合封闭并且无法轻松扩展?
- 使闭包与传统的基于堆栈的过程转换保持一致是否有问题?
请注意,该问题通常与程序,面向对象和脚本语言有关。据我所知,函数式语言没有任何问题。