В вашем коде, когда вы вызываете рекурсию, вы должны снова передавать значения в параметры в (lambda args (lambda (x) ...))
, когда правильным будет просто перебрать аргументы. Кроме того, вы забыли на самом деле применить процедуры! Выражение наподобие этого: ((null? (cdr args)) (car args) x)
игнорирует результат (car args)
и просто возвращает x
.
Чтобы увидеть это более четко, давайте посмотрим, как решение должно выглядеть для случая в частности, скажем - нам нужно только составить три процедуры. Обратите внимание, что мы возвращаем один lambda
и как применяются процедуры:
(define (compose f g h)
(lambda (x)
(f (g (h x)))))
Мы должны подойти к проблеме по-другому: мы должны вернуть (lambda (x) ...)
только один раз и "l oop" должен обработать список аргументов перед его возвратом. Может быть, как-то так?
(define compose-many
(lambda args
; we return (lambda (x) ...) only once, is not part of the recursion
(lambda (x)
; here we loop over the args list
(define (helper args)
(if (null? args)
x
; notice the "((" here we apply the procedure!
((car args) (helper (cdr args)))))
; call the helper a single time and we're done!
(helper args))))
((compose-many add1 add1 add1) 3)
=> 6