The idea is take '(a b c d e) and return '(e a b c d). Just a shift. An efficient solution in Scheme requires continuation-passing style, otherwise, you can end up going down the list twice. ; Kennis's solution : (define rotate (lambda (l) (let loop ((l l) (k (lambda (x) x))) (cond ((null? l) (k '())) ((null? (cdr l)) (cons (car l) (k '()))) (else (loop (cdr l) (lambda (x) (k (cons (car l) x))))))))) ; a simple change defines reverse, too: (define rotate (lambda (l) (let loop ((l l) (k (lambda (x) x))) (cond ((null? l) (k '())) ((null? (cdr l)) (cons (car l) (k '()))) (else (loop (cdr l) (lambda (x) (cons (car l) (k x)))))))))