像无限循环这样的长期功能:
> (define appendInf
(lambda (lst)
(appendInf (cons 1 lst)))
在 Chez Scheme 中,make-engine 可以实现 tick 后停止:
> (define eng
(make-engine
(lambda ()
(appendInf '()))))
当然,在 lst 的范围内,我在以下情况下会出错:
> (eng 50
list
(lambda (new-eng)
(set! eng new-eng)
(length lst)))
Exception: variable lst is not bound
如果我想在达到时间限制时在 appendInf 中获取值 'lst',我使用 set!:
> (define lst '())
> (define appendInf
(lambda (ls)
(set! lst (cons 1 ls))
(appendInf lst)))
现在我可以得到:
> (eng 50
list
(lambda (new-eng)
(set! eng new-eng)
(length lst)))
8
因此,对于我要跟踪的函数中的每个变量,都需要添加一个全局变量,并通过添加 (set!...) 再进行一个转换。
- 这是处理任何封闭变量的正确方法吗?
- 如果是 1,在方案中是否有更好的方法来实现这一目标?
- 是否有任何编程语言可以更轻松地实现这种调试?