2010-06-27 40 views
2

这在方案一怪功能:机制方案的功能的

(将f (呼叫/立方厘米 (拉姆达(x)x)))

(((F“F )f)1)

当在命令行中调用f时,显示的结果是f。 这种机制的解释是什么?

谢谢!

回答

3

你刚刚偶然发现了'延续',可能是计划中最难理解的东西。

call/cccall-with-current-continuation的缩写,该过程所做的是将单个参数函数作为自己的参数,并用当前的“继续”调用它。

那么什么是延续?这是非常难以解释,你应该谷歌它得到比我更好的解释。但是延续仅仅是一个论点的功能,它的主体代表了价值的某种“延续”。如果我们有(+ 2 (* 2 exp))而exp是一个随机表达式,如果我们评估该表达式,则存在等待该结果的“延续”,评估继续进行的地方,如果它评估为3,则插入价值转化为表达式(* 2 3),并从那里继续下一个“继续”,或继续进行评估的地方,即(+ 2 ...)

在几乎所有的编程语言环境中,计算值与其开始位置相同的地方是相同的,但许多语言中的return语句是一个关键的反例,其延续与完全不同返回语句本身。

在Scheme中,你可以直接控制你的延续,你可以像在那里一样捕获它们。 f所做的只不过是对当前的延续进行评估,毕竟当(lambda (x) x)被当前延续调用时,它只是对它进行评估,因此整个函数体都会这样做。正如我所说的,延续是功能本身,它们的身体可以被看作是它们将要捕获的延续,这被设计师着名地表明,延续只是简单的lambda抽象。

所以在代码f中首先评估它被称为的延续。然后,作为函数的这个延续应用于'f(符号)。这意味着那个符号被带回到那个继续,在那里它被再次评估为一个符号,以揭示它所绑定的函数,它又被一个符号作为它的参数调用,最后被显示。

一种令人震惊的,如果你看过电影“底”,这也许解释了它:

http://thisdomainisirrelevant.net/1047

+0

非常感谢你的解释和链接! – shaku 2010-06-27 18:50:48