なんだか微妙にちぐはぐだな。かたや高階関数を使いこなしているかと思いきゃ $length は
末尾再帰でもなんでもない再帰だし。末尾再帰を使わないのに reduce とか使いこなすって,
どーゆう段階でそんなんなるんだろ。ちょっと興味あるね。↓みたいのならわかるんだが。

(defun $reverse (lst)
(if (null lst)
nil
(append ($reverse (cdr lst)) (list (car lst)))))

(defun $length (lst)
(if (null lst)
0
(+ 1 ($length (cdr lst)))))