sme*_*eeb 19 closures data-structures
我试图理解闭包,但实际上我能找到的闭包的每一个定义都使用了同样神秘而模糊的短语:" 关闭 ".
什么是关闭?" 哦,这是一个关闭另一个功能的功能. "
但我无处可寻找"结束"的含义.有人可以解释一下A对于"关闭"Thing B意味着什么吗?
Mat*_*att 10
闭包是由代码指针和环境指针组成的对.环境指针包含给定函数的所有自由变量.例如:
fun f(a, b) =
let fun g(c, d) = a + b + c + d
in g end
val g = f(1, 2)
val result = g(3, 4) (*should be 10*)
Run Code Online (Sandbox Code Playgroud)
该函数g包含两个自由变量:a和b.如果您不熟悉术语自由变量,则它是一个未在函数范围内定义的变量.在这种情况下,要关闭某些东西,意味着从函数中删除任何自由变量的出现.上面的例子为闭包提供了良好的动机.当函数f返回时,我们需要能够记住以后的值a和值b.编译它的方法是将函数g视为代码指针和包含所有自由变量的记录,例如:
fun g(c, d, env) = env.a + env.b + c + d
fun f(a, b, env) = (g, {a = a, b = b})
val (g, gEnv) = f(1, 2)
val result = g(3, 4, gEnv)
Run Code Online (Sandbox Code Playgroud)
当我们应用函数时g,我们提供调用函数时返回的环境f.请注意,现在函数g不再出现任何未在其范围内定义的变量.我们通常将没有任何自由变量的术语称为已关闭.如果您还不清楚,Matt Might在http://matt.might.net/articles/closure-conversion/上有关于闭包转换的深入解释.