首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案,call/cc

方案,call/cc
EN

Stack Overflow用户
提问于 2012-07-25 10:36:14
回答 2查看 776关注 0票数 2

因此,我正在尝试弄清楚Scheme中的整个call/cc的事情。下面是我正在使用的代码:

代码语言:javascript
复制
(+ 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)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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。

希望大家都明白了!

票数 4
EN

Stack Overflow用户

发布于 2012-07-29 15:59:19

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

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

代码语言:javascript
复制
( .... 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)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11641926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档