球拍:在一定范围内进行惰性评估
Racket: lazy evaluation within some scope
Racket 提供了一个 language extension 用于惰性评估,只需要在某些文件的开头使用 #lang lazy
header 来更改整个文件的评估策略。
但是,此标准方法仅允许课程级别的粒度;需要一种更好的方法来将延迟评估限制在某个定义的范围内。
Racket 是否提供了一些标准方法来将惰性评估策略限制在某个范围内?我正在寻找类似以下内容的方法:
(eval-lazy (+ 2 2)) ;; only available by explicit or implicit call-by-need
#lang lazy
是一种与 #lang racket
完全不同的语言。是的,您可以混合和匹配某些部分,但是在 #lang racket
模块中处理来自 #lang lazy
的惰性值可能会变得混乱。
每个方案,包括球拍,都有 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 提供了一个stream library which can be used to do 90% of all algorithms in a way where you do abstract each step as it's own process where you can compose them together without getting the penalty of lists. Streams are just delayed values in cons
popularized in SICP
Racket 提供了一个 language extension 用于惰性评估,只需要在某些文件的开头使用 #lang lazy
header 来更改整个文件的评估策略。
但是,此标准方法仅允许课程级别的粒度;需要一种更好的方法来将延迟评估限制在某个定义的范围内。
Racket 是否提供了一些标准方法来将惰性评估策略限制在某个范围内?我正在寻找类似以下内容的方法:
(eval-lazy (+ 2 2)) ;; only available by explicit or implicit call-by-need
#lang lazy
是一种与 #lang racket
完全不同的语言。是的,您可以混合和匹配某些部分,但是在 #lang racket
模块中处理来自 #lang lazy
的惰性值可能会变得混乱。
每个方案,包括球拍,都有 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 提供了一个stream library which can be used to do 90% of all algorithms in a way where you do abstract each step as it's own process where you can compose them together without getting the penalty of lists. Streams are just delayed values in cons
popularized in SICP