Многие, возможно, большинство языковых реализаций, которые включают компилятор во время выполнения, пренебрегают сборкой мусора отбрасываемого кода (см., например, 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
define
уже определил привязки, поэтому он не соответствует стандартной схеме, и результат недоопределен. Определите его на верхнем уровне и используйтеset!
в процедурах. - person Sylwester   schedule 25.12.2020redefine
. Гамбит? Массачусетский технологический институт? Из-за этого интерактивная разработка была громоздкой. - person bobcat   schedule 26.12.2020