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