Example solutions
;; list -> integer
(defun length (lst)
(if (endp lst)
0
(+ 1 (length (cdr lst)))))
or
;; list -> integer -> integer
(defun length-tail (lst n)
(if (endp lst)
n
(length-tail (cdr lst) (+ n 1))))
;; list -> number
(defun length (lst n)
(length lst 0))
;; list -> list -> list
(defun reverse-tail (x y)
(if (endp x)
y
(reverse-tail (cdr x) (cons (car x) y))))
;; list -> list
(defun reverse (x)
(reverse-tail x nil))
or
;; list -> list
(defun reverse (lst)
(if (endp lst)
nil
(append (reverse (cdr lst)) (list (car lst)))))
;; list -> number
(defun sum-list (lst)
(if (endp lst)
0
(+ (car lst) (sum-list (cdr lst)))))
or
;; list -> number -> list
(defun sum-list-tail (lst n)
(if (endp lst)
n
(sum-list-tail (cdr lst) (+ n (car lst)))))
;; list -> number
(defun sum-list (lst)
(sum-list-tail lst 0))
;; list -> list -> integer -> list
(defun rotate-tail (x y n)
(if (zp n)
(append x (reverse y))
(rotate-tail (cdr x) (cons (car x) y) (- n 1))))
;; list -> number -> list
(defun rotate (lst n)
(cond ((< n 0) (rotate lst (+ (length lst) n)))
((zp n) lst)
(t (rotate-tail lst nil (mod n (length lst))))))
or
;; list -> integer -> list
(defun first-n (lst n)
(if (or (endp lst) (<= n 0))
nil
(cons (car lst) (first-n (cdr lst) (- n 1)))))
;; list -> integer -> list
(defun nth-cdr (lst n)
(if (or (endp lst) (<= n 0))
lst
(nth-cdr (cdr lst) (- n 1))))
;; list -> integer -> list
(defun rotate (lst n)
(append (nth-cdr lst (- (length lst) n)) (first-n lst n)))
or
;; list -> integer -> list
(defun rotate (lst n)
(if (or (zp n) (< n 0))
lst
(rotate (append (cdr lst) (list (car lst))) (- n 1))))