It is now <variadic>
... because <...>
is a TUPLE! under our current rules, similar to a...b
If you believe it should be legal to say </foo to call < with a refinement, or <.foo to field select out of <, then <...> being a tuple makes sense.
But if I switch to hard quoting, it ignores the type:
>> ints: func [:i [integer! <...>]][collect [while [not tail? i][keep take i]]] == make action! [[:i return:] [...]]
Hard quoting is now 'param due to my seemingly logical belief that :param is more semiotic for suggesting "can be escaped with a colon at the callsite". I discuss that maybe ':param is better for "escapable quotable"
Soft quoting gets closer to what I'm looking for, at least using the expression barrier, but bombs on the wrong type:
COMMA! has replaced | as the expression barrier.
ints: func [:i [any-value! <...>] d [decimal!]]
Variadics always take from the end, no matter where you put them. This function would expect a decimal parameter as its first argument.
** Script Error: ints does not allow decimal! for its i argument
A typed variadic parameter doesn't discern the lookahead from TAKE-ing in terms of being constrained to types. This is why I will sometimes separate out a 'look [<opt> any-value! <variadic>]
parameter used for looking, so that the variables that do the TAKE-ing can remain typed.
ints: func ['look [<opt> any-value! <variadic>] 'i [integer! <variadic>]] [
collect [while [integer? first look] [keep take i]]
]
>> x: ints 1 2 3 4.0
== 4.0
>> x
== [1 2 3]
Variadics are old, and haven't gone through much review, to pare back their weird design to something maybe more fitting to their common uses.