> The easiest solution to your problem might be a callable table whose keys are the types of arguments and whose values are different function implementation.
Yes. But there's a problem: how do you define the table for, say, the variadic function '+ ?
Your solution(s) are approximately what I had in mind, although I think I found some problems with it last night, and I just woke up and can't remember quite yet (brain is still booting or something).
(def + rest
(reduce <base>+ rest))
(defm <base>+ ((t x string) (t y string))
(join x y))
Further, optional parameters are simply ignored and considered as part of the rest parameter (i.e. they can't be typed). Basically, the typesystem matches on the first N parameters, where N is how many type parameters you care to define.
Why the first N parameters? So that we can protect against optional parameters defaulting to values that are inappropriate for other types, such as the 'scanner example I gave above.