It would even be possible to make a wild mash-up like this:
(symbol
(name "make-list")
(procedure
(traditional-signature
(arg "n")
(arg "fill" optional)
(return "list"))
(typed-signature
((range-length-zero) -> vector-empty)
((range-length-zero any) -> vector-empty)
((range-length-not-zero) -> vector-not-empty)
((range-length-not-zero any) -> vector-not-empty))))
The typed signature would get the arg names from the traditional one.
But this reads like a bit of a franken-signature to me.
With only the typed signatures it would be like this:
(symbol
(name "make-list")
(procedure
((n range-length-zero) -> (list list-empty))
((n range-length-zero) (fill any) -> (list list-empty))
((n range-length-not-zero) -> (list list-not-empty))
((n range-length-not-zero) (fill any) -> (list list-not-empty))))
The downside is that arg names are duplicated between variants of the
argument list, and we'll need an algorithm to derive the traditional
Lisp-style signature.