【发布时间】:2021-08-03 18:21:25
【问题描述】:
目前,我一直在阅读由 Kent Dybvig 撰写的《the scheme programming language 》一书。
在5.7部分,它使用scheme宏系统在scheme中实现了记忆惰性eval。
源代码为
(define-syntax delay
(syntax-rules ()
[(_ expr) (make-promise (lambda () expr))]))
(define make-promise
(lambda (p)
(let ([val #f] [set? #f])
(lambda ()
(unless set?
(let ([x (p)])
(unless set?
(set! val x)
(set! set? #t))))
val))))
(define force
(lambda (promise)
(promise)))
但我不明白为什么变量set? 需要在过程make-promise 中测试两次。
这就是书上的原因
变量集的第二个测试?在 make-promise 是必要的情况下,由于 应用 p,promise 是递归强制的。由于 promise 必须总是返回相同的值,所以结果 返回第一个完成的 p 应用程序。
我看不懂
谁能给我解释一下?谢谢!
【问题讨论】:
-
评估承诺可能涉及递归强制它,这可能会改变
set?? -
通过延迟评估,您基本上可以在链中延迟,并且该可能不仅是一个级别,而且可能第三级指向第一级等。因此调用
(p)可能会更新相同版本val,然后set?从false更改为true,然后它不应该设置它,因为它已经设置了。
标签: macros scheme lazy-evaluation