Если у вас есть рабочая процедура, преобразование в анонимные процедуры является относительно простым и механическим. Дайте каждой лямбде дополнительный аргумент, который является «собой», и продублируйте процедуру. Так
(define (add-list list)
(if (empty? list)
0
(+ (first list) (add-list (rest list)))))
Становится
(λ(list) (if (empty? list) 0 (+ (first list) (add-list (rest list)))))
Это, конечно, проблема, потому что add-list
не определено. Таким образом, мы должны быть уверены, что каждый раз обходим себя.
(λ(self list) (if (empty? list) 0 (+ (first list) (self self (rest list)))))
Но где мы можем получить себя в первую очередь? Ну, мы копируем и вставляем (и приводим аргумент)
((λ(self list) (if (empty? list) 0 (+ (first list) (self self (rest list)))))
(λ(self list) (if (empty? list) 0 (+ (first list) (self self (rest list)))))
'(1 2 3 4))
Абстракция этого «копирования и вставки» к y-комбинатору великолепно разработана в «Почему из Y», и вам обязательно стоит это проверить.
Но помните, что первым шагом было «заставить его работать». Сделайте это, прежде чем абстрагироваться define
s.