But the reverse call isn't one level removed. The call
to reverse is the first argument and it is being evaluated
in scalar context. In your example you have only one case of using a
literal list in the foo_bar() call, which gives you a prototype
error. In all other cases you are calling foo_bar() with a single
expression that will be evaluated according to the context of the first (or
only in your case) prototype.