Вам нужно назвать свою процедуру карри, чтобы вы могли использовать ее для остальной части списка из самого себя:
(define (add-list intial-value)
(define (curried-proc lst)
...)
curried-proc) ; return the proc
Я не знаю, зачем вам этот интерфейс.Я бы предпочел сделать (add-list 2 '(1 2 3)) ; ==> (3 4 5)
, тогда вы бы сделали это:
(define (add-list initial-value lst)
(define (helper lst)
...)
(helper lst)) ; return the result of calling helper
То есть помощнику. Вам нужно обработать только первый элемент и выполнить рекурсивный анализ для остальных, если не ноль.Для нуля это должно быть нулем.например.
(define (helper lst)
(if (null? lst)
<??> ; what is the result of (incall 5 '())
(cons <calculate> ; what whould (car x) be replaced with?
(helper (cdr lst)))))
Теперь помощник можно заменить на имя let
.Это то же самое.Вот рабочая версия чего-то похожего на то, что вы делаете:
(define (halve-list lst)
(let helper ((lst lst))
(if (null? lst)
'()
(cons (/ (car lst) 2)
(helper (cdr lst))))))
(halve-list '(1 2 3 4)) ; ==> (1/2 1 3/2 2)
Другой способ сделать это с помощью map
, поскольку он заботится о большей части помощника, за исключением того, что делать с каждым элементом:
(define (halve-list lst)
(map (lambda (e) (/ e 2)) lst))