- (let ((stack nil))
- (do ((i 2 (1+ i)))
- ((> i n))
- (let ((f i))
- (loop
- (unless stack (return))
- (let ((top (car stack)))
- (when (< f top) (return))
- (setf f (* f top))
- (pop stack)))
- (push f stack)))
- (do ((stack stack (cdr stack))
- (a 1 (* a (car stack))))
- ((null stack) a))))