Чтобы написать вашу процедуру, мы хотим взять список ввода xs
и построить новый список, например
(cons (third-element xs)
(cons (second-element xs)
(cons (first-element xs)
(everything-except-the-first-three-elements xs)))
В ракетке у вас есть car
и cdr
, но у вас также естьcadr
, caddr
, cddddr
и все, что находится между .
Чтобы получить для них интуицию, a
читает голову, d
читает хвост, поэтому
car
получает голову (первый элемент в списке) cdr
получает хвост (все, кроме первого элемента в списке) cadr
получает голову хвоста (второй элемент в списке) cddr
получает хвост хвоста (все, кроме первого и второго элементов в списке) caddr
получает голову хвоста хвоста (третий элемент в списке) - и так далее ...
Мы можем легко написать это, используя наш car
и cdr
помощники
(define (swap xs)
(cons (caddr xs) ; cons the third element ...
(cons (cadr xs) ; onto the second element ...
(cons (car xs) ; onto the first element ...
(cdddr xs))))) ; onto the tail of the third element
(swap '(1 2 3)) ; '(3 2 1)
(swap '(1 2 3 4)) ; '(3 2 1 4)
(swap '((1 2) (3) (4))) ; '((4) (3) (1 2))