【问题标题】:a question about memorized lazy eval macro in scheme language关于在方案语言中记忆惰性 eval 宏的问题
【发布时间】: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


【解决方案1】:

关键是force 可以重新进入自己。也许一个例子可以帮助你理解这一点:

(define x 5)

(letrec ([f (delay
              (if (zero? x)
                  0
                  (begin
                    (set! x (- x 1))
                    (+ (force f) 1))))])
  (force f))

结果将是0,因为内部force 调用返回0。

如果没有第二次测试,结果将是5。在这种情况下,每个(force f) 都会返回不同的值。

【讨论】:

    猜你喜欢
    • 2011-11-20
    • 2021-08-05
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多