Minor thing:
You can have a variable number of return values:
[On CMUCL 19C]
CL-USER> (defun foo (&rest args)
(apply #'values args))
FOO
CL-USER> (foo 'a)
A
CL-USER> (foo 'a 'b)
A
B
Though this is not completely flexible:
CL-USER> multiple-values-limit
536870911