在运行时包含编译器的多种(可能是大多数)语言实现忽略了垃圾收集丢弃的代码(例如,参见julia,这会导致遗传编程等应用程序中的内存泄漏)
我的初步测试表明 Chez Scheme 不会在这里泄漏内存,但我想更确定地知道,因为我什至不知道是否f
并且g
实际上被编译了。(古老的口头禅:“测试只能证明错误的存在,而不是它们的缺失”)
我尝试的测试:f
并g
互相调用,它们的定义在运行时被替换。
(define f)
(define g)
(define (make-f x)
(eval `(set! f (lambda (y)
(if (> y 100)
(+ (remainder ,x 3) (g y))
(+ y 1))))))
(define (make-g x)
(eval `(set! g (lambda (y)
(if (< y 10)
(+ (remainder ,x 5) (f y))
(div y 2))))))
(define (make-and-run-f n)
(begin
(make-f 1)
(make-g 1)
(let loop ((i 0) (acc 0))
(if (> i n)
acc
(begin
(make-f i)
(make-g i)
(loop (+ i 1) (+ acc (f 33))))))))
(time (make-and-run-f 1000000)) ; runs in 10 min and negligible memory