2009-07-13 50 views
7

这与What is call/cc?有关,但我不想为了自己的目的劫持这个问题,并且像setjmp/longjmp的类比这样的一些参数可以回避我。通话细节/ cc

我想我对继续是什么有足够的想法,我认为它是当前调用堆栈的快照。我不想讨论为什么这可能会很有趣,或者你可以用延续来做什么。我的问题更具体地说,为什么我必须提供一个函数参数来调用/ cc?为什么不叫/ cc只是返回当前的延续,所以我可以随心所欲地做任何事情(存储它,称它,你的名字)?在从另一个问题(http://community.schemewiki.org/?call-with-current-continuation-for-C-programmers)的链接中,它谈到了“基本上它只是一个干净的方式来获得延续给你,并阻止后续跳回到保存的点。”,但我没有得到它。似乎不必要的复杂。

+0

看着这个主题,我完全不清楚你以后的事情,以及为什么你找到了LtU的帖子照亮。也许你可以编辑这个问题来更好地解释这些问题? – 2009-12-09 14:05:40

+0

我认为这个问题仍然反映了我正在努力解决的问题,这可能是LtU海报的“测试”一词,与我一起使用,因为它让我想到了简单地返回延续的后果,当你调用它。问题中的schemewiki.org网址的引用基本上涵盖了所有这些,但正如我之前所说,我没有得到它。这是对的,但我没有“看到”。理解不是线性依赖于信息,有时它需要一个转折点。 – ThomasH 2009-12-10 10:14:57

+0

好吧,明白了!关于理解这条曲折道路的观点是公平的,但试图回答一个问题有点令人沮丧,而且无法弄清楚提问者为什么拒绝这个问题。 – 2009-12-11 08:34:36

回答

2

反对常见的SO网络礼仪我正在回答我自己的问题,但更多的是作为编辑而不是答案的提供者。

过了一段时间,我开始了一个类似的问题,在LtU。毕竟,这些人是一整天都在思考语言设计的人,是不是他们,其中一个answers终于和我一起踢了。现在这里提到的东西,例如通过Eli或原始问题,对我来说更有意义。这是所有关于什么被包含在延续,其中施加的延续将在

其中posters在LTU写道:

“你可以看到究竟是如何调用/立方厘米让你”保持在em或get/cc中,你需要做一些测试来确定你是否有反跳或者只是初始调用,基本上,call/cc保持继续使用延续,而对于get/cc或em,continuation包含它的用法,所以(通常)需要在continuation的开始处(即紧跟在get/cc/em之后)添加一个测试以分隔“使用连续部分”从“继续”的其余部分。“

它开车回家给我。

谢谢你们!

2

这将不太灵活。如果你想要的行为,你可以这样做:

(call/cc (lambda (x) x)) 

你可以看看在延续的示例用法与当前持续形态‘的模式语言8日电话会议“达雷尔·弗格森和德怀特Deugo。’的程序。2001年9月。“ (http://library.readscheme.org/page6.html)并尝试使用上面定义的call/cc-return来重写它们。

+0

感谢您展示我如何降低到这个角落的情况。但我想要一个解释,而不是解决方案。 – ThomasH 2009-07-13 15:05:54

9

如果你使用像杰伊表演这样的结构,那么你可以抓住延续,但是在某种程度上,抓住的价值已经被破坏了,因为你已经在延续。相比之下,call/cc可用于抓取继续,即仍在以外的当前表达式。例如,延续的最简单的用途之一是实现一种的abort的:

(call/cc (lambda (abort) 
      (+ 1 2 (abort 9)))) 

你不能做到这一点与操作你描述。如果你尝试它:

(define (get-cc) (call/cc values)) 
(let ([abort (get-cc)]) (+ 1 2 (abort 9))) 

然后你得到一个关于申请9作为一个过程的错误。这是因为abort跳回let9新的价值 - 这意味着,你现在在做第二轮的相同添加表情,只是现在abort势必9 ......

两个其他相关说明:

  1. 有关延续的很好的实用介绍,请参阅PLAI
  2. call/cc有点复杂,因为它具有功能 - 概念上更易于使用的结构是let/cc,您可以在PLT Scheme等某些实现中找到它。上面的例子变成(let/cc abort (+ 1 2 (abort 9)))
+0

所以,你说我的问题,是(a)如果延续立即返回它是“被宠坏”,因为我在延续。但除非我打电话,否则我不能进入延续。如果延续是一流的价值观,他们不能通过传递给他们,他们可以吗?! 然后,你说(b)call/cc会获得一个“未决”延续。价值如何可以待定?你也可以说(c)延续是在当前表达之外。我不太明白。持续捕获多少钱?一切尽在但不包括呼叫/ cc?的呼叫? – ThomasH 2009-07-14 11:15:22

2

我建议先问自己:做一流的延续意味着什么?

表达式的延续本质上由两部分数据组成:首先是表达式的闭包(即环境)其次,表达应该对表达结果做些什么。然后,具有一流延续的语言是一种具有封装这些部分的数据结构的语言,它将这些数据结构视为任何其他结构。

call/cc是一个特别优雅的方式来实现这个想法:当前的继续被打包成一个过程,它封装了将要完成的事情与表达式,表达;以这种方式来表示延续只是意味着这个过程的关闭包含了它被调用的地点的环境。

你可以想象在其他方面实现一流延续的想法。他们不会被称为/ cc,我很难想象这样的表示如何更简单。

在临别笔记,可以考虑让/ CC以利所说,我宁愿调用bind /立方厘米的实现:

(define-syntax bind/cc 
    (syntax-rules() 
     ((bind/cc var . body) 
      (call/cc (lambda (var) . body))))) 

而且作为一个练习,你将如何实现呼叫/ cc,基于结合/ cc的?