据我所知,在大型程序中使用流比在 DrRacket.So 中使用普通的Lisp更有效,为什么不是DrRacket中的默认评估是惰性评估呢?我编写并放置了一个计时器程序,用于计算完成工作所需的时间,在每个复杂的程序中,懒惰的评估要快得多。
AFAIK 在执行排序之类的操作时使用流是浪费周期,因为您需要完成排序才能知道第一个元素。如果你的任务像排序一样工作,所以你需要评估整个集合,你最终会比没有流使用更多的时间。原因是整个流系统既有成本也有收益。
流的好处是你可以并行进行计算,这样程序就不需要在处理第一个元素之前执行整个循环。如果你有 n 层处理流,当你的程序退出并且所有其他层还没有为你服务
时,你会受益。DrRacket不是一种语言,而是一种IDE。Racket既是一种语言(#!racket
作为第一行源代码),也是实现它的实现的名称。
支持#!lazy
这是Racket的懒惰版本。基本上一切都像流一样工作,无处不在。您将拥有相同的收益和成本。
提到的语言都不是 Scheme,但#!racket
是基于 #!r5rs
的超集。从那时起,您就有了#!r6rs
和新的#!r7rs
.没有一个官方计划报告是懒惰的。原因是它的前身很急切,让它变得懒惰会完全改变语言并破坏所有向后兼容性。
1975年Scheme的创新是词汇闭包。创建者在后来的报告中根据需要进行了懒惰评估(通过实施delay
和force
)。其他语言,如 Haskell,被构建为从地面懒惰,它们有一个更高级的编译器来不断折叠并使其代码活泼。