### Optional Function Arguments

A function argument is optional if it is not referenced when the function is invoked.

func1(x, y)

{

if (x < 0)

return(y);

else

return(x);

}

func1(1)    returns: 1

func1(-1)   returns: y: Unknown Variable

Optional arguments can be tested using the argc variable:

optfun(a, b)

{

/* default b and/or a if not specified */

if (argc < 2)

{

if (argc < 1) a = 1;

b = 10;

}

return(a * b);

}

optfun(2, 3)  returns: 6

optfun(2)     returns: 20

optfun()      returns: 10

### Default Argument Values

Arguments can also be assigned default values directly in the argument list:

optfun2(a = 1, b = 10)

{

return(a * b);

}

optfun2(2, 3)  returns: 6

optfun2(2)     returns: 20

optfun2()      returns: 10

The default value of an argument can be any valid value. Default values can depend on arguments that occur earlier in the argument list.

optfun3(a = 10, b = 1..3, c = a * b)

{

return(a + b + c);

}

optfun3()      returns: {21, 32, 43}

optfun3(1)     returns: {3, 5, 7}

optfun3(1, 2)  returns: 5

Specifying default argument values in the SPL argument list can greatly simplify the initialization steps of an SPL function.

### Output Argument Count

The outargc variable indicates how many variables will be assigned by a function. For example:

outtest(x)

{

if (outargc > 1)

{

return(x, x * x)

}

else

{

return(x)

}

}

a = outtest(1..100)

(a, b) = outtest(1..100)

In both assignments, a is set to the series 1..100, however in the first example, the squared series x*x is not calculated since outargc is 1.

outargc allows multi-value functions to be more efficient by testing whether a particular return value even needs to be calculated.