gpt4 book ai didi

scheme - Guile 方案中如何使用惰性求值?

转载 作者:行者123 更新时间:2023-12-01 13:42:32 28 4
gpt4 key购买 nike

我编写了一个代码,它使用惰性求值来产生无限的数据结构,但是有一个错误。

这是代码:

#!/usr/bin/guile \
-e main -s
!#
(define ints-f
(lambda (n)
(let ((n1 (delay (ints-f (+ n 1)))))
(cons n (force n1)))))
(define (main args)
(display (car (ints-f 3) ))
(newline)
)

这给出了一个错误,说堆栈溢出。这意味着即使没有调用强制也正在执行。如何纠正这种情况?
#!/usr/bin/guile \
-e main -s
!#
(define ints-f
(lambda (n)
(let ((n1 (delay (ints-f (+ n 1)))))
(cons n n1))))
(define (main args)
(display (car (ints-f 3) ))
(newline)
)

上面的代码给出了 3 的预期输出,但是如果我使用 cdr,如下面的代码
#!/usr/bin/guile \
-e main -s
!#
(define ints-f
(lambda (n)
(let ((n1 (delay (ints-f (+ n 1)))))
(cons n n1))))
(define (main args)
(display (cdr (ints-f 3) ))
(newline)
)

它打印一个 promise 对象。

如何在 guile 方案中使用惰性求值?

最佳答案

您是否正在尝试创建流?您不妨咨询 (srfi srfi-41) 用于实现的模块。 (披露:我编写了模块代码的 Guile 特定部分;其他所有内容都是从 the reference implementation 移植的。)

(use-modules (srfi srfi-41))
(define-stream (ints-f n)
(stream-cons n (ints-f (1+ n))))

请注意 define-streamstream-cons是共同构建( SRFI 45 -style) delay 的宏/ force在幕后。†

使用示例:
> (stream->list 10 (ints-f 100))
(100 101 102 103 104 105 106 107 108 109)

† 特别是,您的功能扩展为:
(define (ints-f n)
(lazy (eager (cons (delay n)
(lazy (ints-f (1+ n)))))))

您可以使用:
> (define x (ints-f 100))
> (force (car (force x)))
100
> (force (car (force (cdr (force x)))))
101

关于scheme - Guile 方案中如何使用惰性求值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38778261/

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