我想连续运行一个程序,直到用户使用control-C停止它或关闭窗口。跟随循环会导致内存堆栈溢出还是尾部优化递归?
(define (f)
(let loop ()
(println "In loop.")
(sleep 1)
(loop)))
(f)
此外,是否也遵循相同或不同的方式?
(for ((i (in-naturals)))
(println "In for loop")
(sleep 1))
答案 0 :(得分:3)
Scheme标准要求尾调用优化。原因是语言中没有没有其他循环结构。您有do
等等,但是如果您阅读报告,则它们是类似递归过程的语法糖。
Racket,与#lang racket
一样,与标准方案共享,这样第一个尾递归代码永远不会导致过多的内存使用或堆栈溢出。
第二个是#lang racket
特定的特殊形式,它仍然是递归过程的语法糖,就像do
一样,它也不会堆叠溢出,但理论上这个数字有可能变大比你的系统可用内存和内存不足错误。由于你的一秒延迟,这不会发生在这个地球的生命周期中,但是外部因素如断电或系统硬件故障更可能是你的运行递归循环的结束。