因此,我正在尝试弄清楚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 []),这是“继续”。(我说的对吗?)所以我们调用带有我刚才描述的延续的k,(+ 1 [])。在函数中,它然后询问这是否是一个数字,它不是,并执行" then“。我在这里“迷失”了,第二个call/cc做了什么?为了使整个代码的计算结果为5,调用了什么(k 4)
发布于 2012-07-25 10:43:10
你已经很接近了!我认为你所有的问题都是对的。
传递给call/cc的函数接受一个参数(在您的示例中为k),它是将一个值返回到当前延续的一种方式。k是一个参数函数。当您使用一个值调用该函数时,该值将被返回并代替_:(+ 1 _)中的值。
因此,在您的示例中,(number? k)永远不会为真,并且对call/cc的第二个调用永远不会执行。(即使是这样,它也会失败,并出现运行时错误,即(- 1 k)从1中减去一个函数。)所以它实际上执行了"else“分支:(k 4),返回4到(+ 1 4),所以结果是5。
希望大家都明白了!
发布于 2012-07-29 15:59:19
call/cc就像setjmp一样。它定义了一个出口点,后面的代码可以像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 ...)调用点的延续。对于程序员来说,只要我们有权使用它,我们就可以使用它。
延续是一个参数的函数。当该函数被调用时,它会将其参数传递给context的调用上下文。但是由于k是一个名为value的第一类,我们可以自由地传递它。“内部”代码可以像我们想要的那样复杂,它可以调用其他地方定义的其他函数,等等。如果它将k作为参数传递给这些外部函数,它也可以使用它。
使用值调用k意味着将该值返回到原始(call/cc ...)调用的调用上下文中。直接使用的。就像那里的longjmp一样(除了我们可以在那里返回任何值,而不仅仅是int)。
https://stackoverflow.com/questions/11641926
复制相似问题