I'm recalling Kenneth Iverson's mantra, that math notations come in two flavors: executable (machine-runnable) and not. [1]
Naturally, we'd expect some in-betweens, so those would be the ends of a spectrum.
A given presentation may contain a combination of runnable and not-runnable parts, or if we choose, we might say "not-runnable" might still be "brain runnable" i.e. meaningful to human readers.
I don't dispute we have this choice.
The analogy with musical ensembles is clear: machine recordings and playback devices mix with live performance and improv.
Or maybe the show is entirely delivered by robots, as in a Disney exhibit (audio-animatronics)?
Following the performance, appreciating its logic, depends on a mix of spontaneous delivery and automation, in most scenarios.
Along those lines, a hallmark of the non-executable math languages is they assign names to quantities in a meta language, usually in a prose of some kind, as in word / story problems.
"Let x be the number of sheep in Farmer J's yard." This is done to get the ball rolling, a gentleman's agreement of sorts (a lawyer thing, a contract) to just agree on some terms ("... let us use X and J to denote...").
In contrast, in executable languages (the ones robots might follow), the act of assignment is so deeply important that the equal sign (=) has actually been re-purposed in a lot of them, turned into an operator (!).
Binding names to objects is so critical, so intrinsic to the math!
In Python for example, we have like post-its (like sticky paper, names thereon), and objects "on the heap" (picture a pile of broken jars or something -- better if not broken :-D). When I go...
X = 3
...I'm at that moment in time (when this statement "runs") affixing a post-it with the letter 'X' on it, a legal "name", to some "object in memory" which we also name 3, literally (but somewhat confusingly, as 3 = X is disallowed).
It's a little as if we as gods (seeing from above), actually have two names for some Platonic invisibility: both X (the new name) and 3. Both refer back to the "meaning" of the symbol "3" (don't get me started on how I disagree with that mental model.... Wittgenstein and blah blah).
In any case, as far as Python is concerned, X = 3 is providing us with future use of X like a "remote controller" (picture a TV remote) of some object (3) on the heap.
X is the name whereby the object may be made to do its tricks, whatever they may be.
With TV remote X, you go X.on (so-called "dot notation") to turn it on, and X.off to turn it off. You can even go: X.change_channel(n) although with integer objects that's not an option. Different types come with different abilities.
To reiterate:
this_remote = TV( ) # <--- gives birth to a new TV object and name it
Calling the type (or class) triggers the birth of an instance. TV is the "Platonic factory" (oxymoron?) for special case TVs (more breakable).
number = int( )
is the same idea, with int being the mother of all ints (integers). It's able to understand inputs from different bases e.g. number = int("101001010", 2) or number = int("AFFF", 16). 330 and 45055 respectively (in base 10).
Again, in non-executable math notations, object creation and naming is not that big a deal as we handle it in English or Russian or Italian or whatever, before launching into our symbolic manipulations (our algorithmics, our algebra, applying whatever laws of equality or other "magic" to "solve for X" or whatever the objective).
But in executable languages, naming is an operation within the math notation itself, of primordial importance, that cannot be left to some "English" or other set of human constructs.
Running in computer memory (an energetic act) the executable math notatation ("MN" -- Iverson) must take care of naming as a mechanical act, an act no less primordial than addition or subtraction, or string concatenation.
* * *
Which brings me to a segue to another topic, for another time: another hallmark of the computer maths is they take string manipulation as seriously or more so than number crunching.
Those coming from an arithmetic background (typical in K-12 US), are surprised to discover that computers are so much more "word processy" than "number crunchy", because computer math has from the beginning always worked with strings (in the sense of letters, not "string theory" strings).
That emphasis on string operations, treating "A" as an equal to 3 as a "math primitive" is a kind of culture shock for K-12 US math teachers, so groomed to think of math as arithmetic, as number based (much as our segments on functions as a set theory concept suggest this emphasis is unnecessary).
To have to see "regular expressions" i.e. "pattern matchers" (regexps) as "mathematics" is like future shock or something to some faculties. Good thing no one has to treat them that way or go to jail i.e. it's not "the law" to treat them that way, just a best practice by some standards.
No lawyers need involve themselves in these matters of STEM terminology as of course regexes, whatever they are, are part of STEM, regardless of how trivially we care to pigeon-hole.
If we're serious about STEM, we'll teach them, and not just to code schoolers. SQL too.
It's about "how things work" and therefore important to generic literacy. Call it math or don't, but don't expect other schools to play dumb either way.
Students will be getting into good code schools and snagging good jobs on the basis of their regex skills (in addition, not entirely), not just for their basic algebra or calculus knowledge.
In some states, we'll say that's because they're "better at math" whereas in other states we'll expect some different taxonomy, i.e. they'll say "discrete math" is really "computer science". Stay tuned.