У меня есть функция Scheme, базовая форма которой выглядит следующим образом
(define (foo param var)
(cond ((end-condition) (return-something))
((other-end-condit) (return-something-else))
(else
(let ((newvar (if some-condition
(make-some-updated var)
(destructive-update! var))))
(foo param newvar)))))
Я чувствую, что это довольно явно то, что нужно оптимизировать для итерации при компиляции, но когда я компилирую это (с курицей), оно все равно работает невероятно медленно. (если я понимаю спецификации R5RS: http://groups.csail.mit.edu/mac/ftpdir/scheme-reports/r5rs-html.old/r5rs_22.html, похоже, что это должно работать)
Я написал точно такой же алгоритм с циклом while в python, и интерпретируемая программа завершилась за считанные секунды. Моя скомпилированная схема занимает около 15 минут, и я уверен, что алгоритм такой же.
Я думаю, что это хвостовая рекурсия, не получившая оптимизированной проблемы, поскольку я не могу думать, что еще это могло бы быть, но я не могу понять это. Есть идеи? Для чего бы то ни было, var - это хеш, а деструктивное обновление просто добавляет элемент, хотя он также возвращает обновленный хеш, который будет передан как newvar.