Re: say Cool-concat-junction question

2018-12-22 Thread Brad Gilbert
I turns out there is a candidate for

Str:D, Junction:D

but not for

Any:D, Junction:D

so it is going through one of the other &infix:<~> candidates,
specifically it looks like it could be

*@args

Which doesn't apparently work with Junctions. So yes it is a bug.

On Sat, Dec 22, 2018 at 9:05 PM yary  wrote:
>
> What's going on here- is this error a mistake on my part, or a bug?
>
> $ perl6 -e "say 3 ~ ( 'a' | 'b' )"
>
> Type check failed for return value; expected Str:D but got Junction 
> (any("3a", "3b"))
>
>   in block  at -e line 1
>
>
> $ perl6 -e "say 'x' ~ ( 'a' | 'b' )"
>
> any(xa, xb)
>
>
> $ perl6 -v
>
> This is Rakudo Star version 2018.10 built on MoarVM version 2018.10
>
> implementing Perl 6.c.
>
>
>
> -y


say Cool-concat-junction question

2018-12-22 Thread yary
What's going on here- is this error a mistake on my part, or a bug?

$ perl6 -e "say 3 ~ ( 'a' | 'b' )"

Type check failed for return value; expected Str:D but got Junction
(any("3a", "3b"))

  in block  at -e line 1

$ perl6 -e "say 'x' ~ ( 'a' | 'b' )"

any(xa, xb)

$ perl6 -v

This is Rakudo Star version 2018.10 built on MoarVM version 2018.10

implementing Perl 6.c.


-y


Tricks: class cloning

2018-12-22 Thread Vadim Belman
Hi!

Another question to improve understanding of Perl6 internals.

Let's say, I've got an idea of allowing a user to define a 'template' class. 
I.e. it wouldn't be used directly, but I could be used as a base for creating a 
new one (or a couple of new ones – it would depend). Basically, what is needed 
to perform this operation is to create the new class, then copy 
methods/attributes from the template and then set those properties I would need 
(like parent class, for example). The following code even do some of the job:

 class Foo {
 ...
 method foo { ... }
 }

 my \type = Metamodel::ClassHOW.new_type( name => 'Foo-clone' );

 for Foo.^methods(:local) -> $m {
 next if $m.?is-hidden-from-backtrace;
 type.^add_method( $m.name, $m.clone );
 }

 type.^compose;

 my $inst = type.new;

 $inst.foo;

Except that that .foo cannot be called on Foo-clone because it has an implicit 
constraint Foo:D for 'self'. I tried re-compose the method signature and pass 
it to method's clone:

 $m.clone( :$signature );

but ended up with 'unexpected named parameter' error. So far, this is where I 
stuck and would like to know if there is a workaround for this?

Basically, what I'm trying to achieve is could also be done by using a role as 
a template which could then be applied to the custom class. But roles has a few 
restrictions which would make them less flexible.

Best regards,
Vadim Belman