My question concerned lisp beginners.
I agree that the right answer is the Y-combinator.
Below is a quite different solution, a fanciful one.
We need two general auxiliary functions : apply-bis, rplac.
(e : lambda expression , a : apply argument list)
The core of the factorial program is the s-expression beginning with
apply-bis, ending with the argument 5.
(defun apply-bis (e a) (apply (rplac e e) a))
; rplac replaces the "here" atom by a pointer to e (the lambda expression)
(defun rplac (e f)
(cond ((atom e) nil)
((equal (car e) 'here) (rplaca e f) f)
(t (or (rplac (car e) f) (rplac (cdr e) f)))))
(apply-bis '(lambda (x)(cond ((= x 1) 1)
(t (* x (apply 'here (list (- x 1)))))))
(list 5))
That's it.