首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Racket:在某个范围内的懒惰评估

Racket:在某个范围内的懒惰评估
EN

Stack Overflow用户
提问于 2017-02-02 21:44:37
回答 1查看 1.4K关注 0票数 0

Racket提供了一个用于惰性评估的语言延伸,它只需要在某个文件的开头使用一个#lang lazy头来在整个文件中更改评估策略。

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

是否提供了一些标准方法来将懒惰的评估策略限制在某个范围内?,我正在寻找以下内容:

代码语言:javascript
复制
(eval-lazy (+ 2 2)) ;; only available by explicit or implicit call-by-need
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-02 23:09:20

#lang lazy是一种完全不同于#lang racket的语言。是的,您可以混合和匹配某些部分,但是处理#lang lazy#lang racket模块中的惰性值会变得很麻烦。

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

代码语言:javascript
复制
(define promise (delay (+ 2 2)))
(force promise) ; ==> 4

不过,这只是语法糖,因为您可以这样做:

代码语言:javascript
复制
(define promise (thunk (+ 2 2)))
(promise) ; ==> 4

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

代码语言:javascript
复制
(define promise (lambda () (+ 2 2)))
(promise) ; ==> 4

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

代码语言:javascript
复制
(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提供了一个流库,它可以用于完成90%的算法,以抽象每一步,因为这是您自己的过程,您可以将它们组合在一起,而不需要对列表进行惩罚。流只是cons中在SICP中推广的延迟值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42012842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档