gpt4 book ai didi

functional-programming - 理解 Let/cc 和 throw in racket

转载 作者:行者123 更新时间:2023-12-04 02:09:22 24 4
gpt4 key购买 nike

在类里面,我们讨论了 racket 中的两个函数,即 letcc 和 throw。讲师说 let/cc 与当前延续的调用有关,而 throw 只是将 a 应用于 b 例如。

(throw a b)

我在网上找不到太多关于这些的信息。我确实找到了一个关于 letcc 的问题在 stackoverflow 上,但我无法从中完全理解 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。我只想了解这两个概念,以便在期中考试中处理此类问题。

最佳答案

我们先来看let/cc

表达式 (let/cc k e) 将 1) 捕获当前延续(表示为函数),然后 2) 将变量 k 绑定(bind)到捕获的延续,并且最后 3) 计算表达式 e

按顺序举几个例子。

如果在表达式 e 的求值过程中,捕获的连续 k 没有被调用,那么 let/cc 表达式的值为只是表达式 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。它是来自 misc1/throw 的那个吗?

或者可能是 Might 的文章中的那个? http://matt.might.net/articles/programming-with-continuations--exceptions-backtracking-search-threads-generators-coroutines/

或者您可能正在使用定义

(define (throw k v)
(k v))

如果是后者,那么您可以将我示例中的(k v)替换为(throw k v)

更新

请注意,绑定(bind)到 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 示例的“逐步”评估。

(let/cc k0
((let/cc k1
(k0 (sub1 (let/cc k2
(k1 k2)))))
1))

(let/cc k0
(k2 1))

(let/cc k0
((let/cc k1
(k0 (sub1 1)))
1))

(let/cc k0
((let/cc k1
(k0 0))
1))

0

关于functional-programming - 理解 Let/cc 和 throw in racket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40141905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com