'Таким образом, вы неправильно поняли анонимные функции, речь идет не только о создании во время выполнения, но и о области действия. Рассмотрим этот макрос схемы:
(define-syntax lambdarec
(syntax-rules ()
((lambdarec (tag . params) . body)
((lambda ()
(define (tag . params) . body)
tag)))))
такой, что:
(lambdarec (f n) (if (<= n 0) 1 (* n (f (- n 1)))))
Оценивает истинную анонимную рекурсивную факториальную функцию, которую можно использовать, например:
(let ;no letrec used
((factorial (lambdarec (f n) (if (<= n 0) 1 (* n (f (- n 1)))))))
(factorial 4)) ; ===> 24
Однако истинная причина анонимности заключается в том, что если я это сделаю:
((lambdarec (f n) (if (<= n 0) 1 (* n (f (- n 1))))) 4)
Функция впоследствии очищается из памяти и не имеет области видимости, поэтому после этого:
(f 4)
Будет либо сигнализировать об ошибке, либо будет привязан к тому, с чем f был связан ранее.
В Хаскеле, специальный способ достичь этого будет:
\n -> let fac x = if x<2 then 1 else fac (x-1) * x
in fac n
Разница в том, что эта функция не имеет области видимости, если я ее не использую, а для Haskell значение Lazy - то же самое, что и пустая строка кода, оно действительно буквально, поскольку имеет тот же эффект, что и Код C:
3;
Буквальное число. И даже если я воспользуюсь им сразу после этого, он исчезнет. В этом смысл буквальных функций, а не создание во время выполнения как таковое.