On Thu Aug 06 06:18:57 2015, lloyd.fo...@gmail.com wrote:
> Context: I am trying to make a fun syntax where Class[@args] is an alias
> for Class.new(@args)
> 
> -----
> class C {};
> sub postcircumfix:<[ ]>(C:U $c, Str $arg){ say 'win' };
> my $c = C;
> $c['test']; #-> win
> C['test'];  #!> C cannot be parameterized
> 
> ------

The syntax TypeName[...] is syntactically a type parameterization, by design. 
If you really want to force interpretation as an array indexing, it'd have to 
be written as:

C.['test']; #-> win

> I also tried:
> ------
> role R { method parameterize(|) { say $*d; } };
> class C {};
> BEGIN { C.HOW does R };
> my $*d = 'win';
> C[my $a = 'test']; #-> win
> C['test']                #!> Dynamic variable $*d not found
> 
> ------
> But I can't use dynamic variables because if it's called with a compile
> time variable it runs .parameterize at compile time only.
> 
Yes, and we're allowed to form parametric types at compile time whenever we 
know we have the parameters available (and if we can't do that, we have a lot 
of problems; for one it's the very mechanism that allows you to `does` a 
parametric role on a class declaration!) A parameterize method that isn't 
prepared to be called at compile time is buggy.

> I tentatively suggest that at least one of these is a bug as they together
> prevent you using [] on a type to callback to something using $*dynamic
> variables consistently.

Both behaviors are as intended. In general, anything of the form `<typename> 
<postcircumfix>` should be considered a special form. It's a pity we have to 
overload bracketing chars, but sadly ASCII is a bit limiting!

Thanks,

Jonathan

Reply via email to