我寫了一個代碼,它使用延遲評估來產生無限的數據結構,但有一個錯誤。如何在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'調用它。唯一的區別是承諾會緩存結果,因此兩次強制承諾不會重新計算計算結果。整體語言的語義仍然完全嚴格。 –