Вы имеете в виду: как использовать функции более высокого порядка, чтобы получить другую функцию?Если это так, взгляните на это:
(lambda (f) (lambda (x) (f x)))
Что это делает:
1: создать анонимное закрытие, инициализированное «f» в качестве параметра
2: в рамках первого тела создайте замыкание с параметром «x»
3: примените f к x (f - замыкание поверх x)
Чтоэто означает, что (до (fx) оценивается), f объявляется как функция с x в качестве аргумента.Применение f к x - это то, что возвращает все это выражение: в этом случае ничего особенного, поскольку мы не присваиваем никакого значения, кроме замыканий.
Используя это в качестве начальной точки, рассмотрим, что происходит, когда замыкание возвращает другое замыкание: внутреннее закрытие оценивается ПОСЛЕ того, как внешнее закрытие передало свое значение в своем теле.Она называется отложенной оценкой и позволяет передавать процедуры в виде значений, чтобы внутренняя процедура могла расширяться позже.
Вот конкретный пример того, насколько это может быть полезно.Давайте определим cons, car и cdr, используя только функции высшего порядка (замыкания):
(define (cons kar kdr) (lambda (kons) (kons kar kdr)))
(define (car kons) (kons (lambda (kar kdr) kar)))
(define (cdr kons) (kons (lambda (kar kdr) kdr)))
Чтобы понять это, передайте определения, но помните, что (define (foo bar) ...) означает (definefoo (лямбда (бар) ...)) ...