パターンマッチによる再帰

CL-USER> (defmethod my-fold (f e (ls (eql nil))) e)
CL-USER> (defmethod my-fold (f e ls)
           (my-fold f (funcall f e (car ls)) (cdr ls)) )

CL-USER> (my-fold #'(lambda (x y) (cons y x)) '() '(5 4 3 2 1))
(1 2 3 4 5)

思いつきでmultimethodsでやってみたけど、Haskellほど綺麗には見えないね。
ifで書いた方がはやいか。

追記(09/01/26)

あとはこんなのとか・・・

CL-USER> (defun my-map (f ls)
           (case ls
             ((nil) nil)
             (otherwise (destructuring-bind (x . xs) ls
                          (cons (funcall f x) (my-map f xs)) ))))
MY-MAP

CL-USER> (my-map #'1+ '(1 2 3))
(2 3 4)

やっぱり微妙でございますね(´ω`)