В процессе обучения ракетки и получать в программирование вообще я определял ormap два различных способов:Оптимизирован оптимизация булевых операторов?
(define (or-map proc lst)
(cond
[(null? lst) #false]
[(proc (car lst)) #true]
[else (or-map proc (cdr lst))]))
(define (or-map proc lst)
(if (null? lst)
#false
(or (proc (car lst)) ; <-- this one
(or-map proc (cdr lst)))))
Следующие вопросы пришел на ум:
оптимизированли второй один хвост вызов? Я не был уверен, что пропущенная строка отбрасывается (или (или ...) складывает свои аргументы), потому что если это #true, вызов функции завершается, и если это #false, это должно быть неактуально для дальнейшей оценки (или ...) заявление.
Так что я побежал следующий тест и посмотрел на менеджера задачи для использования памяти:
(define (test)
(or #f
(test)))
(test)
Память осталась прежней. Поэтому я думаю, что могу заключить (или ... *) получает оптимизацию хвоста? Я предположил, что остается верным для (и ... *) и других логических операторов, но, как я изменил или в (тест) к ни память заполнена.
Так что в целом, я
- есть некоторые ошибки в моих выводов до сих пор?
- Что происходит с nor-test?
- Правомерно предположить, что оба моих определения or-map эквивалентны производительности или предпочтительны друг для друга?
- (мое использование диспетчера задач в этом случае даже legitamate и это явление, я свидетельствую там, когда память заполняется StackOverflow или последствия его?)