Tuples

Here I discuss the logical foundation of tuples, in accordance with the "data as function" concept as proposed by Jørgen Steensgaard-Madsen in his 1989 paper for the CACM titled "Typed Representation of Objects by Functions".

In Fexl I represent tuples inside the curly braces "{}". A tuple may have zero or more elements separated by spaces within the curly braces. Here are some examples of tuples whose elements are simple numbers:

{}
{1}
{1 2}
{1 2 3}
{1 2 3 4}

Note that the first example is the empty tuple {} consisting of zero elements.

Although a tuple is a data object, it nevertheless behaves as a function when you apply it to an argument. That argument is used as a handler function, and all the elements of the tuple are passed into that handler function as successive arguments. That is how you retrieve the individual elements of a tuple almost effortlessly.

In light of that concept, here are the functional equivalents for the example tuples listed above:

(\f f)
(\f f 1)
(\f f 1 2)
(\f f 1 2 3)
(\f f 1 2 3 4)

To look into it a little further, let's look at an example of grabbing the elements of the tuple {1 2 3}.

# Here's our tuple.
\p={1 2 3}

# Now let's grab the elements of p, naming them x, y, and z.
p \x\y\z

# Print the elements.
say ["x = "x]
say ["y = "y]
say ["z = "z]

So what is actually happening there, especially on this line?

p \x\y\z

First, I will add parentheses to highlight the exact functional structure:

\p={1 2 3}

p
    (\x\y\z
    say ["x = "x]
    say ["y = "y]
    say ["z = "z]
    )

Next, I eliminate the intermediate "p" symbol:

{1 2 3}
    (\x\y\z
    say ["x = "x]
    say ["y = "y]
    say ["z = "z]
    )

Then I replace the tuple with its functional equivalent:

(\f f 1 2 3)
    (\x\y\z
    say ["x = "x]
    say ["y = "y]
    say ["z = "z]
    )

Now we are looking at a case of quite ordinary lambda reduction. The next step is to substitute the value of "f" with the argument passed in:

(\x\y\z
say ["x = "x]
say ["y = "y]
say ["z = "z]
)
1 2 3

Then we proceed to substitute the values for the x, y, and z parameters:

say ["x = "1]
say ["y = "2]
say ["z = "3]

At that point it is abundantly clear how evaluation proceeds from there.