leontrolski - Generalised plusequals

3 min read Original article ↗

2026-04-24

I have a quarter baked language I've been working on. It's mostly crap, but a syntax idea fell out that I think is pretty neat.

The following are equivalent in many languages:

x = x + 1
x += 1

Reassigning is cool as it's lexically scoped so easy to reason about (mutation is bad as it isn't).

The new idea is that instead of special symbols (in this case +=) we generalise with a keyword (alt) that affects all infix operators, so the following are equivalent:

x = x + 1
alt x + 1

Who cares? It's not even shorter right?

The fun starts when we introduce a couple of new infix operators - namely ]= and .=

Let's compare them to the Python equivalents:

l = l[4]=999
l = l[:4] + [999] + l[5:]

and:

x = x.n.=2
x = dataclasses.replace(x, n=2)

Now let's set up a couple of examples of nested data:

cat = Cat(age=3)
l = [1, [2, cat], 4]

If we want to reassign to make an older cat, we can do:

alt cat.age.=8

The more interesting example is reassigning the deeply nested l to make the cat inside older, without mutating the original cat:

alt l[1][1].age.=9

this will leave us with l equal to:

[1, [2, Cat(age=9)], 4]

What was the alt statement sugar for, such that we didn't mutate the original cat? Well, the rather ungainly:

_1 = l[1]       # _1 = [2, Cat(age=3)]
_2 = l[1][1]    # _2 = Cat(age=3)
_2 = _2.age.=9  # _2 = Cat(age=9)
_1 = _1[1]=_2   # _1 = [2, Cat(age=9)]
l  = l[1]=_1    # l  = [1, [2, Cat(age=9)], 4]

My new language has a nice(?) feature - you can infix plain binary functions with tildes - this means you can do fun stuff like:

alt l~push~5

to leave l equal to:

[1, [2, Cat(age=9)], 4, 5]

Thoughts