consider that the people who do not view Lisp as a kind of C++ (and such people are, thankfully, the majority of Lisp users) really appreciate CMUCL's reluctance to perform invasive compile-time checking of function argument types. that's because in Lisp, unlike in C++, functions can be redefined at any time. if you still want the compiler to perform such checks, though, try declaiming FOO's type at the top level (so that it effectively becomes a part of FOO's interface), like this:
(declaim (ftype (function (float) float) foo))
that way you will (among other compiler verbiage) get a warning about the type of 1 not being FLOAT.