In the original Comefrome0x10 grammar, I skipped unary minus. In retrospect, its presence has important consequences that I should have considered earlier, so unary minus made me reverse a couple decisions.
Comefrom0x10 uses newlines to delimit statements, which is fairly common in modern languages. What is not so common is that a standalone expression has a side effect: it writes to program output, as in PowerShell. This makes hello world succinct:
Prior to adding the unary minus operator, I allowed line continuation if an operator started a line, so these would be equivalent:
x = 2 + 3
x = 2
But unary minus causes problems. These lines could be either “
3 - 2” or “
print 3; print -2“:
I could continue to allow operators at the end of a line to indicate line continuation, but I’ve never liked end-of-line line markers for continuation as they are too hard to see. Comefrom0x10, therefore, now has no facility at all for line continuation. I will figure it out when I have a burning need.
Unary minus causes a second problem, when interacting with cf0x10’s concatenation behavior.
In cf0x10, space is the concatenation operator: “
'foo' 'bar' is 'foobar' # true“. Originally, I allowed the concatenation space to be optional, so “
name'@'domain” would be equivalent to “
name '@' domain“.
Enter unary minus. In most languages, all three of these expressions mean “a minus b”, but in the original cf0x10 grammar, they could indicate either concatenation with negative b or subtraction:
a - b
Other languages do allow space concatenation, but normally only for literals. In Python, for example:
>>> 'a' 'b'
>>> a, b = 'a', 'b'
>>> a b # ILLEGAL in Python, but LEGAL in cf0x10
SyntaxError: invalid syntax
In css, space is even an operator and “-” can appear at the beginning of an identifier. The css grammar, avoids ambiguity, however, by making “-” mathematical only when followed by a number, as in “
-2px” versus “
--foo” is illegal. Css gets away with this because it has no variables, making the operand’s type known during parsing.
Since the cf0x10 parser cannot know operand types, Comefrom0x10 has two options. It could decide whether to subtract or concatenate at runtime, or it could make the grammar a bit less forgiving of how you use spaces. Spacing is already significant, so, on balance, I think that making the spacing rules restrictive is the more clear:
a -b # concatenation
a-b # subtraction
a - b # subtraction
a- b # syntax error
The rules are that concatenation requires at least one space and unary minus cannot be followed by a space.