在课堂上我们讨论了球拍i-e letcc和throw中的两个功能。讲师说让/ cc与调用当前的continuation有关,而throw只是应用于b,例如。
(throw a b)
我还没能在网上找到这些。我确实在stackoverflow上找到了letcc的问题,但我还是无法完全理解letcc的功能。有人可以用一个简单的例子用简单的语言解释这两个吗?
Edit1:同样在我的中考中,我们有两个与之相关的问题。
对于包含let / cc使用的以下每个表达式,每个表达式的值是什么?
(let/cc k (throw (throw k 5) 6))
(let/cc k (throw k ((( lambda (x) x) k) (∗ 5 5))))
这些答案分别为5和25。我只是想了解这两个概念,以便我可以在期中考试中处理这些问题。
答案 0 :(得分:2)
让我们先看let/cc
。
表达式(let/cc k e)
将1)捕获当前的continuation(表示为函数)然后2)将变量k
绑定到捕获的continuation,最后3)计算表达式e
。
一些例子是有序的。
如果在评估表达式e
期间,未调用捕获的控制k
,则let/cc
表达式的值只是表达式{的值() {1}}评估为。
e
如果另一方面> (+ 10 (let/cc k 32))
42
的值为k
,则整个v
表达式的值变为let\cc
。
v
请注意,系统会跳过调用> (+ 10 (let/cc k (+ 1 (k 2))))
12
周围的(+ _)
部分。
该值将立即返回到(k 2)
的延续。
(let/cc ...)
最常见的用法是模仿许多基于语句的语言中已知的控制结构let/cc
。这是经典的闰年问题:
return
那么(define (divisible-by? y k)
(zero? (remainder y k)))
(define (leap-year? y)
(let/cc return
(when (not (divisible-by? y 4))
(return #f))
(when (not (divisible-by? y 100))
(return #t))
(when (not (divisible-by? y 400))
(return #f))
#t))
(for/list ([y (in-range 1898 1906)])
(list y (leap-year? y)))
呢?这取决于我们所谈论的throw
。
它来自throw
吗?
或者也许来自Might的文章? http://matt.might.net/articles/programming-with-continuations--exceptions-backtracking-search-threads-generators-coroutines/
或许您正在使用定义
misc1/throw
如果是后者,那么您可以使用(define (throw k v)
(k v))
替换我的示例中的(k v)
。
更新
请注意,绑定到(throw k v)
的延续可以多次使用 - 它也可以在k
表达式之外使用。考虑这个例子:
let/cc
如果不运行它,你能弄明白它的作用吗?
这是一个"一步一步"评估嵌套的(define n 0)
(let ([K (let/cc k k)])
(when (< n 10)
(displayln n)
(set! n (+ n 1))
(K K)))
示例。
let/cc