function - Scheme中函数的机制

标签 function scheme racket

这是Scheme中的一个奇怪的函数:

(定义 f (调用/抄送 (lambda (x) x) ) )

(((f 'f) f) 1 )

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

谢谢!

最佳答案

您刚刚偶然发现了“延续”,这可能是Scheme 中最难理解的事情。

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

那么什么是延续呢?这很难解释,你可能应该用谷歌搜索一下以获得比我更好的解释。但延续只是一个参数的函数,其主体代表值的某种“延续”。

就像,当我们有 (+ 2 (* 2 exp)) 且 exp 是一个随机表达式时,如果我们计算该表达式,就会有一个“延续”等待该结果,其中计算继续,例如,如果计算结果为 3,它将将该值插入到表达式 (* 2 3) 中,并从那里继续下一个“继续”,或者继续计算的位置,其中是(+ 2 ...)

在几乎所有编程语言的上下文中,继续计算值的位置与开始的位置相同,尽管许多语言中的 return 语句是一个关键的反例,但延续位于与 return 语句本身完全不同的地方。

在Scheme中,您可以直接控制您的延续,您可以像在那里那样“捕获”它们。 f 所做的无非是评估当前的延续,毕竟,当使用当前的延续调用 (lambda (x) x) 时,它只是评估它,整个函数体也是如此。正如我所说,延续是函数本身,其主体可以被视为它们要捕获的延续,Scheme 的设计者著名地表明,延续只是 lambda 抽象。

因此,在代码中,f 首先计算出它被调用的延续。然后,将此延续作为函数应用于 'f (符号)。这意味着该符号被带回到该延续,在那里它再次被评估为符号,以显示它所绑定(bind)的函数,该函数再次以符号作为其参数被调用,最终显示。

有点令人难以置信,如果您看过电影“入门”,也许这可以解释它:

http://thisdomainisirrelevant.net/1047

关于function - Scheme中函数的机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3128263/

相关文章:

默认参数的python函数

parsing - 什么 Lisp 更擅长解析?

recursion - 如何从方案、 Racket 中的列表制作 HTML

racket - 如何从涂鸦/文本重新导出 #%module-begin 等?

recursion - 骑士之旅深度优先搜索回溯

javascript - 在循环中将动态参数传递给回调函数

javascript - 事件处理程序和函数

javascript - 自调用函数的替代语法?

scheme - 如何检查/导出/序列化(诡计)Scheme 环境

compiler-errors - 方案契约(Contract)违约错误