这是Scheme中的一个奇怪的功能:
(定义f (呼叫/立方厘米 (lambda(x)x)))
(((f'f)f)1)
在命令行中调用f时,显示的结果为f。 这种机制有什么解释?..
谢谢!
答案 0 :(得分:3)
你刚刚偶然发现'延续',可能是最难理解的方案。
call/cc
是call-with-current-continuation
的缩写,过程的作用是将单个参数函数作为自己的参数,并使用当前的“continuation”调用它。
那么什么是延续?这是臭名昭着的难以解释,你应该谷歌它来获得比我更好的解释。但是延续只是一个参数的函数,其主体代表某个值的某个“延续”。
就像,当我们将(+ 2 (* 2 exp))
与exp作为随机表达式时,如果我们评估该表达式,则会有一个'continuation'等待该结果,一个评估继续的地方,如果它的计算结果为3,例如,它将该值插入表达式(* 2 3)
并从那里继续下一个'延续',或继续评估的地方,即(+ 2 ...)
。
在编程语言的几乎所有上下文中,计算继续使用值的位置与它开始时的位置相同,尽管许多语言中的return
语句是一个关键的反例,但延续完全不同放置比返回声明本身。
在Scheme中,你可以直接控制你的延续,你可以像在那里那样“捕捉”它们。 f
所做的只不过是评估当前的延续,毕竟当使用当前延续调用(lambda (x) x)
时,它只是计算它,所以整个函数体都这样做。正如我所说,延续是函数本身,它们的身体可以被视为它们要捕获的延续,这是Scheme的设计者所着名的,延续只是简单的lambda抽象。
所以在代码中f首先计算它被调用的延续。然后这个函数的延续应用于'f
(符号)。这意味着该符号返回到该延续,再次作为符号进行评估,以显示它所绑定的函数,再次以符号作为参数调用,最终显示。
有点令人难以置信,如果你看过电影“入门”,也许这就解释了: