В настоящее время работаем с Racket Guide на https://docs.racket-lang.org и читаем о лямбда-функциях. Объяснение их полезности ясное, но я не уверен, что вполне определил порядок, в котором оцениваются такие функции. Рассмотрим следующий пример из Руководства:
(define (twice f v)
(f (f v)))
(define (make-add-suffix s2)
(lambda (s) (string-append s s2)))
(twice (make-add-suffix "!") "hello")
Вызов функции для twice
здесь называется "hello!!"
. Вот мое предположение о том, как выглядит процесс оценки:
(twice (make-add-suffix "!") "hello")
((make-add-suffix "!") ((make-add-suffix "!") "hello")
((make-add-suffix "!") (string-append "hello" "!"))
(string-append (string-append "hello" "!") "!")
(string-append "hello!" "!")
"hello!!"
Это точная оценка, или я что-то пропустил?