【发布时间】:2016-12-11 05:18:59
【问题描述】:
我写了一段代码,它使用惰性求值来产生无限的数据结构,但是有一个错误。
代码如下:
#!/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之后紧接着force,那么你就绕过了 Promise 的惰性属性。delay表单有效地创建了一个 thunk,force调用它。唯一的区别是承诺会缓存它们的结果,因此两次强制相同的承诺不会重新评估计算。整个语言的语义仍然非常严格。
标签: scheme lazy-evaluation guile