【问题标题】:Racket: lazy evaluation within some scopeRacket:在一定范围内进行惰性评估
【发布时间】:2017-02-02 21:44:37
【问题描述】:

Racket 提供了一个 language extension 用于惰性评估,它只需要在某个文件的开头有一个 #lang lazy 标头即可更改整个文件的评估策略。

但是,这种标准方法只允许课程级别的粒度;需要一种更精细的方法来将惰性求值限制在某个定义的范围内。

Racket 是否提供了一些标准方法来将惰性评估策略限制在某个范围内?我正在寻找类似以下的东西:

(eval-lazy (+ 2 2)) ;; only available by explicit or implicit call-by-need

【问题讨论】:

    标签: racket lazy-evaluation


    【解决方案1】:

    #lang lazy 是与#lang racket 完全不同的语言。是的,您可以混合和匹配某些部分,但是在 #lang racket 模块中处理来自 #lang lazy 的惰性值可能会变得混乱。

    每个方案,因此也是球拍,有delayforce

    (define promise (delay (+ 2 2)))
    (force promise) ; ==> 4
    

    但这只是语法糖,因为你可以这样做:

    (define promise (thunk (+ 2 2)))
    (promise) ; ==> 4
    

    当然thunk 只是不带参数的匿名函数的语法糖:

    (define promise (lambda () (+ 2 2)))
    (promise) ; ==> 4
    

    现在delay 实际上稍微复杂一些,因为如果你调用这些函数,它每次都会运行表达式。为了防止这种情况发生,我们记住了结果。在这里,我将您的eval-lazy 实现为宏:

    (define ^not-calculated (list #f)) ; unique value
    (define-syntax eval-lazy
      (syntax-rules ()
        ((_ expression)
         (let ((value ^not-calculated))
           (lambda ()
             (when (eq? ^not-calculated value)
               (set! value expression))
             value)))))
    

    thunklambda 一样,只要调用结果就会强制执行。

    Racket 提供了一个stream library,它可用于执行所有算法的 90%,您可以将每个步骤抽象为它自己的过程,您可以将它们组合在一起而不会受到列表的惩罚。流只是cons 中的延迟值,在SICP 中普及

    【讨论】:

    • 一些cmets: (1) #lang lazy 被制作成与plain racket 非常相似,并使其易于与plain racket 配合(例如,使用racket promises); (2) 因此,处理惰性值并不太麻烦; (3) 可以使用子模块以更小的粒度工作; (4) 不,正确实现承诺绝对不会“稍微复杂一点”,它更多——我建议查看球拍实现,但是更好的是:您的示例代码展示了一些微妙之处,因为它创建了永远不会消失的闭包,因此总是泄漏内存。
    • @EliBarzilay 1-3:因此,使用惰性库可以为您提供可能需要强制执行的承诺。嗯,这比我想象的要容易一些。 4:这可能就是为什么delay 首先是一个Scheme 原语。 SICP 在他们的视频中可能有同样的泄漏。我喜欢阅读球拍代码,所以我有空的时候会看看。从它的扩展来看,delay 似乎既是一个过程又是一个宏。
    • 好吧,(1-2) 它还为您提供!!!!! 以递归方式强制值; (4) 不,由于其他原因,它是一个原语,但很容易以导致内存泄漏的方式错误实现它,我不记得视频中的内容,但在 4.2 中寻找“忘记不需要的环境”查看一个微妙但易于查看的问题,并查看 the racket source 以获取指针和代码。
    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2013-03-11
    • 2017-01-18
    • 2018-11-11
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多