As to mixing variable names up with subtraction, you put spaces in your math formulas? someVar-anotherVar*thirdVar is pretty unpleasant to read, so not being able to do that is not much of a problem.
Perl6's relationship to sigils (like $) is a bit weird at first, but is very consistent and "fits lightly under your hands" in practice. Suffice to say, sigils indicate context and constrain the type of data you can put in a container. If you want to refer directly to a value, you use a sigil-less variable:
my \the-great-answer = 42;
See the docs on varibles if you want more information: https://docs.perl6.org/language/variablesThe `-` must be followed by an alphabetic character (or `_`) for it to be seen as part of an identifier.
So `_-1` is the same as `_ - 1`
{
my \_ = 4;
say _-1; # 3
}
{
sub _ () { 8 }
say _-1; # 7
}
It may be a bad idea to name a variable or subroutine `_` but that is for you to decide, not for Perl6 to decide.
(It's not your overprotective mother.)---
I suppose if you really want to do something completely daft like that, there is not really anything stopping you:
{
my \_ = 3;
say _-1; # 2
my \term:<_-1> = my $ = 4;
say _-1; # 4
_-1 = 53;
say _-1; # 53
say _ -1; # 2
}
Note that it doesn't just create a variable named `_-1`.What it does is much more powerful than that. It modifies the parser lexically to add `_-1` as a term. (Since it is lexical it stops being valid after the closing `}`)
The `my $` is just so that it has a rewritable container so that it can be reassigned to `53` later.
This can be useful for constants that wouldn't otherwise be a valid identifier, and for writing subroutines that are parsed as a bare identifier like a constant would be.
constant term:<> = …
sub term:<foo> () {…}
foo;
foo(); # ERROR: Undeclared routine: foo used at line …
foo 1; # ERROR: Two terms in a row