Racket提供了一个用于惰性评估的语言延伸,它只需要在某个文件的开头使用一个#lang lazy头来在整个文件中更改评估策略。
然而,这种标准方法只允许一个课程级别的粒度;需要更精细的方法来将惰性评估限制在某些定义的范围内。
是否提供了一些标准方法来将懒惰的评估策略限制在某个范围内?,我正在寻找以下内容:
(eval-lazy (+ 2 2)) ;; only available by explicit or implicit call-by-need发布于 2017-02-02 23:09:20
#lang lazy是一种完全不同于#lang racket的语言。是的,您可以混合和匹配某些部分,但是处理#lang lazy在#lang racket模块中的惰性值会变得很麻烦。
每一个方案,因此也是球拍,有delay和force。
(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)))))与thunk和lambda一样,只调用结果就会强制执行。
流
Racket提供了一个流库,它可以用于完成90%的算法,以抽象每一步,因为这是您自己的过程,您可以将它们组合在一起,而不需要对列表进行惩罚。流只是cons中在SICP中推广的延迟值。
https://stackoverflow.com/questions/42012842
复制相似问题