(define (take-right l n) (letrec ((length0 (lambda (l s) (if (pair? l) (length0 (cdr l) (+ s 1)) s)))) (drop l (- (length0 l 0) n)))) (define (drop-right l n) (letrec ((drop-right-dive (lambda (l r n) (if (pair? l) (drop-right-dive (cdr l) (cons (car l) r) n) (drop-right-raise r n)))) (drop-right-raise (lambda (l n) (if (= n 0) (reverse! l) (if (null? l) (error "list argument is too short compared to drop length argument") (drop-right-raise (cdr l) (- n 1))))))) (if (>= n 0) (drop-right-dive l '() n) (error "negative input value"))))