# making functions with a variable number of arguments

It is easy to write a function with a variable number of arguments. Define the function with just one parameter, with no parentheses around it. If the function is called with several arguments, the value of the single parameter will be a sequence containing the several arguments; if the function is called with one argument, the value of the parameter will be that single argument.
 i1 : f = x -> {class x, if class x === Sequence then #x}; i2 : f() o2 = {Sequence, 0} o2 : List i3 : f(3) o3 = {ZZ, } o3 : List i4 : f(3,4) o4 = {Sequence, 2} o4 : List i5 : f(3,4,5) o5 = {Sequence, 3} o5 : List
We could use the function sequence to bring the case where there is just one argument into line with the others. It will enclose anything that is not a sequence in a sequence of length one.
 i6 : f = x -> ( x = sequence x; {class x, #x}); i7 : f() o7 = {Sequence, 0} o7 : List i8 : f(3) o8 = {Sequence, 1} o8 : List i9 : f(3,4) o9 = {Sequence, 2} o9 : List i10 : f(3,4,5) o10 = {Sequence, 3} o10 : List
As an aside, we reveal that there is a way to define a function of one argument that will signal an error if it's given more than one argument: put parentheses around the single parameter in the definition of the function. As a side effect it can be used to extract the single element from a singleton sequence.
 i11 : ((x) -> x) 3 o11 = 3 i12 : 1 : 3 o12 = 1 : (3) o12 : Sequence i13 : ((x) -> x) oo o13 = 3