Tho*_*asH 7 scheme continuations callcc
这与什么是电话/ cc有关?但是我不想为了我自己的目的而劫持这个问题,而且它的一些论据就像对setjmp/longjmp的类比一样逃避了我.
我认为我对延续是什么有足够的了解,我认为它是当前调用堆栈的快照.我不想讨论为什么这可能有趣或者你可以用延续做什么.我的问题更具体地说,为什么我必须提供一个函数参数来调用/ cc?为什么不调用/ cc只返回当前的延续,所以我可以用它做任何事情(存储它,调用它,你命名它)?在另一个问题(http://community.schemewiki.org/?call-with-current-continuation-for-C-programmers)的链接中,它谈到"基本上它只是一种干净的方式来延续你并且不要让后续跳回到保存的点.",但我没有得到它.这似乎不必要地复杂化.
如果你使用类似Jay节目的结构,那么你可以抓住延续,但在某种程度上,抓取的值已经被破坏,因为你已经在那个延续中.相反,call/cc可以用于获取当前表达式之外仍然未决的延续.例如,continuation最简单的用法之一就是实现一种abort:
(call/cc (lambda (abort)
(+ 1 2 (abort 9))))
Run Code Online (Sandbox Code Playgroud)
你不能用你描述的操作做到这一点.如果你试试:
(define (get-cc) (call/cc values))
(let ([abort (get-cc)]) (+ 1 2 (abort 9)))
Run Code Online (Sandbox Code Playgroud)
然后你得到一个关于申请9作为程序的错误.发生这种情况是因为abort跳回到let新值9- 这意味着你现在正在进行第二轮相同的加法表达式,除了现在abort必须9...
另外两个相关说明:
call/cc 它有点复杂,它需要一个函数 - 一个概念上更容易使用的构造let/cc,你可以在PLT Scheme等一些实现中找到它.上面的例子变成了(let/cc abort (+ 1 2 (abort 9))).针对常见的网络礼仪,我正在回答我自己的问题,但更多的是作为编辑而不是答案的提供者。
过了一段时间,我在LtU开始了类似的问题。毕竟,这些人都是整天思考语言设计的人,不是吗?我终于想到了答案之一。现在,这里提到的事情,例如 Eli 或原始问题中提到的事情,对我来说更有意义。这一切都与延续中包含的内容以及应用的延续开始的位置有关。
LtU 的一张海报写道:
“你可以清楚地看到 call/cc 如何让你“避开”。使用 em 或 get/cc 你需要做某种测试来确定你是否有后跳或只是初始呼叫。基本上, call/cc 将延续的使用保留在延续之外,而使用 get/cc 或 em,延续包含其使用,因此(通常)您需要在延续的开头添加一个测试(即紧随 get 之后) /cc / em) 将“使用延续部分”与“其余延续部分”分开。
这让我把它带回家。
不管怎样谢谢你们!
| 归档时间: |
|
| 查看次数: |
1842 次 |
| 最近记录: |