To avoid infinite recursion, `foo' may not call itself.
Quite apart from macros, recursion on *any* procedure with an indefinite number of arguments is bad, because Scheme must copy the argument list on any recursive call, just in case you mutate it. (CL theoretically doesn't have to do this, but all implementations I have tried actually do this). This behavior, which I call "variadic recursion", turns a simple O(n) algorithm on the procedure arguments into O(n^2). The keyword procedure should be a facade over a non-keyword procedure and that's it.
What asininity could I have uttered that they applaud me thus?
--Phocion, Greek orator