Pogoscript Splat Arguments

Some functions can accept an arbitrary number of arguments. Our hypothetical sum above was one of them. To acheive this, we use splats, which is some Ruby terminology for being able to access a number of arguments as one.

Lets finally implement our sum function:

sum (numbers, ...) =
    sumSoFar = 0

    for each @(number) in (numbers)
        sumSoFar := sumSoFar + number

    sumSoFar

When we put some ellipses after numbers, we’re saying that numbers represents all the arguments passed to sum. Likewise, if we had a list of numbers that we wanted to pass to sum when we called it, we could also use the ellipses:

ourNumbers = [1, 2, 3]
sum (ourNumbers, ...)

Which would be the same as:

sum 1 2 3

When defining a function, we can only define one splat parameter, but we can continue to have other non-splat parameters before and after it. For example, the following would work:

sum (first, second, middleNumbers, ..., last) =
    // ...

But for calling a function, we can specify as many splats as we’re happy to:

smallNumbers = [1, 2, 3]
largeNumbers = [7, 8, 9]

sum (smallNumbers) ... 4 5 6 (largeNumbers) ...

The only other restriction when defining functions is that splat parameters cannot be used alongside optional parameters - the following is not allowed:

sum (args, ..., quickly = true) =
    // ...

The reason is that since optional arguments are optionally passed, we can never be sure whether an argument belongs in the splat or if it’s the optional argument. A technical detail, but nonetheless restrictive.