Understanding VARARGS!

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.