Scheme 方案,呼叫/抄送

Scheme 方案,呼叫/抄送,scheme,continuations,callcc,Scheme,Continuations,Callcc,因此,我试图在Scheme中解决整个call/cc问题。以下是我正在使用的代码: (+ 1 (call/cc (lambda (k) (if (number? k) (call/cc (lambda (k) (k (- 1 k)))) (k 4))))) 因此,我们开始在第一个括号中添加两个参数1以及其他我们必须评估的内容,因为我们迫切需要评估。因此我们有一个call/cc,它接受一个参数,一个函数,call/cc通过调用来计算。(我说的对吗?)同时

因此,我试图在Scheme中解决整个
call/cc
问题。以下是我正在使用的代码:

(+ 1 (call/cc
  (lambda (k)
    (if (number? k)
        (call/cc (lambda (k) (k (- 1 k))))
        (k 4)))))

因此,我们开始在第一个括号中添加两个参数<代码>1以及其他我们必须评估的内容,因为我们迫切需要评估。因此我们有一个
call/cc
,它接受一个参数,一个函数,
call/cc
通过调用来计算。(我说的对吗?)同时,它在我们的第一个括号中包含了到目前为止发生的其他事情,即
(+1[])
,这是“延续”。(我说的对吗?)所以我们把lambda
k
和我刚才描述的延续名一起叫做,
(+1[])
。在函数中,它会询问这是否是一个数字,而不是一个数字,并执行“then”。我在这里迷路了,这第二个
呼叫/cc
做什么?调用了什么
(k4)
,以使整个过程评估为
5

您已经非常接近了!我想你所有的问题都是对的

传递给
call/cc
的函数接受一个参数(在示例中为
k
),这是一种将值返回到当前延续的方法
k
是一个参数的函数。当您使用一个值调用该函数时,该值将返回并替代此中的
(+1)

因此,在您的示例中,
(number?k)
永远不会为真,对
call/cc
的第二次调用永远不会执行。(即使是这样,它也会因运行时错误而失败,
(-1k)
从1中减去一个函数。)因此它实际上执行“else”分支:
(k4)
,它将4返回到
(+14)
,因此结果是5


希望这是清楚的

call/cc
就像。它定义了一个退出点,后面的代码可以直接“跳转”到该点,就像
longjmp
那样

它遵循特定的协议,所以我们总是写

( .... surrounding code .....
   (call/cc (lambda (k)
      .... inner code which has access to the exit point "k" ....
      )) .... more surrounding code .... )
在该协议下,“内部”代码照常执行,但其作用域中还有一个名称,
k
。“周围”的代码都无法访问它,因为它超出了
k
的范围

k
这里是一个一级值(自然,正如它的名字所示)。方案运行时系统将在后台自动为其分配
(call/cc…
调用点的延续。对于程序员来说,我们可以在任何时候使用它

延续是一个参数的函数。调用该函数时,它会将其参数传递给continuation的调用上下文。但是由于
k
是一个一级命名值,我们可以自由地传递它。“内部”代码可以任意复杂,它可以调用其他地方定义的其他函数等。如果它将
k
作为参数传递给此类外部函数,它也可以使用它


使用值调用
k
意味着将该值返回到原始
(call/cc…
调用的调用上下文中直接。就像<代码> LangJMP < /Cord>ing(除了我们可以在那里返回任何值,而不只是代码> int <代码>)。

在我说任何东西之前,这意味着在C++术语中,“调用”调用/cc意味着调用另一个函数,但是我只是把函数写为调用/cc调用的参数。第二个问题,如果作为call/cc调用参数的函数有一个或多个参数,我如何定义传递给它们的内容?出现这个问题的原因是,在我的示例中,作为call/cc调用的参数传递给函数的参数究竟是什么?不是一个数字,所以正如你所解释的,它是一个延续“(+1 u)”;在这种情况下。*****第二个问题,如果函数*表示我在call to call/cc中调用的任何东西都意味着我只能返回一个确定的值,或者我将永远等待。。。(k4)到底是什么意思?它是怎么读的?“我把K指定为4?”我知道这是错误的,但这就是我的样子。好,如果我想调用显示语句,我应该改变什么(数字?)到(+ 1)(call /cc(lambda(k))(如果(数字k)(显示)永远不”)(k 4α),我不知道C++,所以我不能真正评论。但是,
call/cc
是一个内置函数,它接受一个参数,并且该参数必须是一个接受单个参数的函数,该参数是单个参数的函数。如果这让您非常困惑,您可能希望从一些比
call/cc
更简单的高阶函数示例开始,因为这是一个非常令人费解的特性。避免隐藏内部范围,最好重命名第二个call/cc的参数。你的意思是
(call/cc(lambda(e)(e(-1e)))
还是
(call/cc(lambda(e)(e(-1k)))
在任何情况下,它都不会被计算,如果你没有if语句,它是错误的。