(defun factorial (n)
  (check-type n (integer 0 *))
  (loop :for fact = 1 :then (* fact i)
        :and i :from 1 :to n
        :finally (return fact)))

(defun factorials (&rest args)
  (loop :for x :in args
        :collect (restart-case (factorial x)
                   (skip-this-shit (&optional y) y))))

(defun fix-input (cond)
  (typecase #1=(type-error-datum cond)
    ((integer * 0) (store-value (abs #1#)))
    (real          (store-value (floor #1#)))
    (t             (invoke-restart 'skip-this-shit :skipped))))

(handler-bind ((type-error #'fix-input))
    (print (factorials 1 5.2 2 3 "sasai" -1 5 6)))
