История изменений
Исправление ilammy, (текущая версия) :
Не, лол, я прекрасно понимаю, что
(define (add a b)
(+ a b))
(define (add a b)
(let ((t a))
(let loop ()
(if (= b 0) t
(begin
(set! t (+ t 1))
(set! b (- b 1))
(loop))))))
Магия, как уже было не раз сказано ранее, состоит в том, что абсолютно все функции принудительно чистые на уровне языка. Это даёт реализации право самой решать, когда применять настоящие побочные эффекты, скрытые «интерфейсами чистых функций» и прочих монад. И она будет их применять тогда, когда ей удобно, а не тогда, когда программисту показалось и он написал это в коде.
Программам легче запомнить кучу особенностей процессоров, так что они вероятно лучше знают, когда там что менять. И чистые функциональные языки это такой договор: «Я не буду мешать, окей? а ты оптимизируй хорошо. Пожалуйста. Ну пожалуйста! Я даже утыкаю код {-# СОТНЕЙ ДИРЕКТИВ -#} и начну объявлять типы в динамически типизированных языках!
Исходная версия ilammy, :
Не, лол, я прекрасно понимаю, что
(define (add a b)
(+ a b))
(define (add a b)
(let ((t a))
(let loop ()
(if (= b 0) t
(begin
(set! t (+ t 1))
(set! b (- b 1))
(loop))))))
Магия, как уже было не раз сказано ранее, состоит в том, что абслютно все функции принудительно чистые на уровне языка. Это даёт реализации право самой решать, когда применять настоящие побочные эффекты, скрытые «интерфейсами чистых функций» и прочих монад. И она будет их применять тогда, когда ей удобно, а тогда, когда программисту показалось и он написал это в коде.
Программам легче запомнить кучу особенностей процессоров, так что они вероятно лучше знают, когда там что менять. И чистые функциональные языки это такой договор: «Я не буду мешать, окей? а ты оптимизируй хорошо. Пожалуйста. Ну пожалуйста! Я даже утыкаю код {-# СОТНЕЙ ДИРЕКТИВ -#} и начну объявлять типы в динамически типизированных языках!