我写了一个代码,它使用延迟评估来产生无限的数据结构,但有一个错误。如何在Guile方案中使用懒惰评估?
下面是代码:
#!/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)
)
它打印一个承诺对象。
如何在guile方案中使用懒惰评估?
如果你立即'延迟'然后'强制',那么你就绕过了承诺的懒惰属性。 'delay'形式有效地创建一个thunk,'force'调用它。唯一的区别是承诺会缓存结果,因此两次强制承诺不会重新计算计算结果。整体语言的语义仍然完全严格。 –