gpt4 book ai didi

scheme - 这是延续传递风格吗?

转载 作者:太空宇宙 更新时间:2023-11-03 18:57:48 24 4
gpt4 key购买 nike

如果函数 acc 作为它的 CPS 函数,并且 cc 调用 a,是 一个 延续传递风格?例如,

(def a
(lambda (b c)
...
(a (cons (c (car b))) c)))

(def cc
(lambda (d)
...
(fold a x y)
(fold a u v)
...

(a '((1 2) 3) cc)

最佳答案

许多以延续传递风格编写的代码严格不是延续传递风格;因为有些调用不会将其结果传递给延续。即便如此,您编写的代码可能不符合半 CPS 的条件。 continuation 传递样式的要点在于,函数不是从函数返回一些结果,而是采用一个称为 continuation 的附加参数,并使用“结果”调用该函数。例如,对列表元素求和的 CPS 函数可能如下所示:

(define (sum-list lst k)
(if (null? lst)
;; if the list is empty, then call the continuation
;; with the sum of the empty list, i.e., zero.
(k 0)
;; Otherwise, compute the sum of the rest of the list,
;; but with a different continuation that will take
;; the sum of the rest of the list, add the first
;; element of the list, and call the original continuation,
;; k, with that combined sum.
(sum-list (cdr lst)
(lambda (sum)
(k (+ (car lst) sum))))))

不过,这不是严格 CPS,因为一些函数,即carcdr+ 不是 CPS;他们将结果返回给调用者,而不是用结果调用延续。

现在让我们看看您提供的代码:

(def a
(lambda (b c)
...
(a (cons (c (car b))) c)))

在Scheme中,会这样写

(define (a b c)
...
(a (cons (c (car b))) c))

cons 的调用有错误的参数数量,但除此之外,没有明确调用延续函数。您在函数位置使用 c,因此您正在利用高阶函数,并且您正在对 a 进行递归调用,但这不是什么这显然是延续传球风格。在你的第二个区 block 中:

(def cc
(lambda (d)
...
(fold a x y)
(fold a u v)

目前还不清楚您要完成的任务。 Fold 未以 CPS 方式使用,您将忽略第一次调用 fold 的结果。这里没有任何东西看起来像 CPS 风格。最后一点,

(a '((1 2) 3) cc)

您正在使用文字列表和 cc 调用 a,这现在大概被定义为一个函数。传递函数与一等函数一起工作,但这并不能使其成为延续传递风格。

关于scheme - 这是延续传递风格吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32740352/

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