Dave Whipp wrote:
I'm thinking that the solution to this issue may be a little more radical than to-date: don't permit junctions to be stored in $ variables! Instead, require junctions to use a twiggle, to alert the reader that the surprises may be lurking.

my $x = 1|2; #error
my $|x = 1|2; # ok

Then you just need to invent some syntax to say that collapse is (or perhaps isn't) desired:

if [[ $|x > 1 ]] { say "$|x collapsed" }

The most important thing that this does is that it leaves open the option to allow "$" variables to hold junctions in some future version of Perl, without that future version being constrained by legacy semantics.

I'd second the twigil idea. Reason: I'd -really- like perl6 to be compilable into an efficient machine code without a JIT magic that we can currently only handwave about.

For that, I'd propose a rule of a thumb: ints are ints. Of course, floats and other unboxed types should also be just plain unboxed types, but I'd like the rule of a thumb to be short and to the point.


int $x = 1|2;

should be an error.


int $x = 1 but "not really a number";

should also be an error or at least a warning that mixin stripping and unboxing took place. If you want polymorphic here, use Ints. That'd also mean that

my @x of int;

can be implemented as a homogenous int vector, meaning -really- efficient and manipulable through the kind of code that modern CPUs are really good at (since as soon as you know you won't be lazy, you only need to be polymorphic about asking for the beginning of the in-memory buffer that can be manipulated directly. Even if that buffer doesn't contain all the elements, you can refill it as needed, and that could still be fast as long as the other side of the partially-lazy barrier also speaks int). Also, as far as I'm aware, there is no tracing VM that can create a homogenous arrays for you if you can't already do them.

From the above, the need for twigils in junctions should be apparent.


Reply via email to