Вот что-то похожее:
(define (addn value n)
(let loop ((value value) (n n))
(if (zero? n)
value
(loop (add1 value) (- n 1)))))
(addn 5 3)
; ==> 8
Теперь вы можете сделать абстракцию:
(define (repeat proc)
(lambda (v n)
...))
(define addn (repeat add1))
(addn 5 3)
; ==> 8
(define shift-k-left (repeat shift-left))
(shift-k-left ’(1 2 3) 2)
; ==> (3 1 2)
Излишне говорить, что repeat
очень похоже на add1
.
Примечание: присвоение имени отключено. Ваша реализация больше «вращается», чем «смещается».
shift-left
на самом деле больше похоже на cdr
, чем ваша реализация.