teaching machines

Dittos in Array Literals

November 30, 2020 by . Filed under public, twoville.

Color is often represented in computers in triplets of red, green, and blue intensities. Expressing a color is a matter of finding the right mix of these intensities. For example, here are the triplets for six of the most famous colors:

red = [1, 0, 0]
green = [0, 1, 0]
blue = [0, 0, 1]
yellow = [1, 1, 0]
cyan = [0, 1, 1]
magenta = [1, 0, 1]

Shades of gray require less understanding of how the intensities combine; all three intensities are the same. These are three shades of gray defined in the CSS standard:

gray = [0.5, 0.5, 0.5]
darkgray = [0.66, 0.66, 0.66]
lightgray = [0.83, 0.83, 0.83]

The names are confusing, but that’s a story for another day.

I am unhappy with how grays are expressed. If I find that a shade is too dark or too light, I have to change three numbers. But not when I’m the one writing the programming language! In Twoville, therefore, I have added a special ditto operator that can be used inside array literals to repeat the previous element.

gray = [0.5, ~, ~]
darkgray = [0.66, ~, ~]
lightgray = [0.83, ~, ~]

The symbol for ditto is the tilde. I wanted it to be a single character for compactness. The other punctuation characters have too much semantic baggage. Tilde is typically only used for bitwise negation, and I’ve got a named function for that. Bitwise negation doesn’t deserve a compact symbol.

Besides expressing grays, the ditto operator makes it easy to enforce square dimensions:

dimensions = [10, ~]

I could have achieved repeating array elements in other ways, perhaps through an array constructor or through some sort of replication operator. These might look something like this:

gray = array(3, 0.5)
gray = [0.5] x 3

But the ditto operator can act as a term in an expression:

powersOfTwo = [1, ~ * 2, ~ * 2, ~ * 2, ~ * 2]

There’s nothing quite as gratifying as being in charge of a language. Before that language has users, anyway.