理解Let / cc并投入球拍

时间:2016-10-19 21:36:32

标签: functional-programming scheme racket

在课堂上我们讨论了球拍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。我只是想了解这两个概念,以便我可以在期中考试中处理这些问题。

1 个答案:

答案 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

如果不运行它,你能弄明白它的作用吗?

这是一个&#34;一步一步&#34;评估嵌套的(define n 0) (let ([K (let/cc k k)]) (when (< n 10) (displayln n) (set! n (+ n 1)) (K K))) 示例。

let/cc