This article is a repost of an ADR from Matanuska BASIC, my attempt to write a BASIC interpreter in TypeScript.
Context
Atto
While researching fantasy consoles, I learned about a BASIC implementation called Atto. In its "from BASIC" doc, it mentions that it uses ;
as its string concatenation operator.
This seems like an odd decision. But it makes sense when you remember that print
in traditional BASIC use ;
to separate expressions. As I understand it, this is ad-hoc syntax in those commands. What Atto does here is take this syntax and generalizes it. That makes it a very interesting and clever design choice.
Matanuska BASIC's Current Behavior
Currently, Matanuska BASIC treats +
as a concatenation operator. This isn't an unusual choice - BASIC8 goes this route, for example. It's also consistent with many modern languages, such as Python.
Traditional BASIC Behavior
The ECMA-55 Standard describes ;
as solely a mechanic within print
statements. Other statements which similarly take multiple arguments use ,
to separate them. In fact, print
will allow expressions to be separated by ,
as well, but treats ,
and ;
differently - put a pin in that.
The specification for PRINT
is... interesting. It specifies fixed-width "zones" for print output within a fixed-width "margin". The specification ensures that numbers can be formatted in a way where they'll always fit within one of these zones. It then specifies that, while ;
is treated as a concatenation operator, ,
generates enough space to align the following value to the next zone. TAB(<n>)
is treated as special syntax which "tabs over" n
number of zones. If a print statement ends in a ;
or ,
, a newline is not generated and the following print statement appends to the end of that line. Finally, if a print statement has enough values that it overflows the margin (or outputs a string which is long enough to do the same), it inserts newlines as-needed to avoid clipping.
Decision
Matanuska will continue to use the +
operator for general purpose string concatenation.
First, +
is common and well-understood in many modern languages, while ;
would be considered strange and unusual. Honestly, that's enough.
But second, ;
isn't treated as a concatenation operator in traditional print statements, as much as it is treated as special syntax for formatting print output - and it's odd syntax at that. Rather than implement ;
as a general purpose string concatenation operator, I'd rather leave print statements as a potential odd duck - or possibly avoid traditional semantics altogether, in favor of either echo
-like behavior or shell-like string "templating".
Top comments (0)