On Mon Oct 10 17:18:34 2011, coke wrote:
> On Thu Nov 26 08:10:19 2009, masak wrote:
> > <masak> rakudo: class A {}; class B {}; subset C of A & B; say C ~~
> A;
> > say C ~~ B
> > <p6eval> rakudo 7347ec: ( no output )
> > <masak> locally, that gives 1\n0\n
> > <moritz_> std: class A {}; class B {}; subset C of A & B; say C ~~
> A;
> > say C ~~ B
> > <p6eval> std 29199: ok 00:01 106m
> > <moritz_> masak: everything that declares a new class makes p6eval
> > time out
> > * masak submits rakudobug
> > <masak> ah! the 'subset' syntax only expects exactly one type.
> > <masak> that explains the strange output from the first one-liner.
> > <masak> rakudo: subset C of (Str & Int); say C ~~ Str; say C ~~ Int
> > <p6eval> rakudo 7347ec: Confused at line 2, near "of (Str & " [...]
> > <moritz_> masak: subsets are basically a nominal type + constraints,
> I
> > don't think you can make a symmetric, conjunctive type of two other
> > types
> > <masak> moritz_: no, probably not.
> > <masak> moritz_: wait. it depends. for roles, it shouldn't be a
> > problem.
> > <masak> actually, now I don't see the problem at all.
> > <masak> the nominal part happens to be an and-junction.
>
> Current behavior:
>
> 20:17 < [Coke]> rakudo: class A {}; class B {}; subset C of A & B; say
> C ~~
> A;say C ~~ B
> 20:17 <+p6eval> rakudo 38907e: OUTPUT«Type check failed in assignment
> to '$v';
> expected 'Mu' but got 'C' in method REIFY at
> src/gen/CORE.setting:4391 in method reify at
> src/gen/CORE.setting:3657 in method reify at
> src/gen/CORE.setting:3657 in method gimme at
> src/gen/CORE.setting:4015 in metho…
02:40 < [Coke]> rakudo: class A {}; class B {}; subset C of A & B; say C ~~ A;
say C ~~ B # RT#70844
02:40 <+camelia> rakudo bfd850: OUTPUT«TrueFalse»
02:41 < TimToady> I'm pretty sure that's parsing as (subset C of A) & B
02:42 * TimToady is a little surprised it's not giving a "Useless use of & in
sink context"
02:44 < [Coke]> rakudo: class A {}; class B {}; subset C of (A & B); say C ~~
A; say C ~~ B # RT#70844
02:44 <+camelia> rakudo bfd850: OUTPUT«===SORRY!===Confusedat
/tmp/XuBccnEAYS:1------> class A {}; class B {}; subset C of
⏏(A & B); say C ~~ A; say C ~~ B # RT#708 expecting any
of: statement list horizontal whitespace
postfix …
02:45 < TimToady> [Coke]: note that the 'of' trait only allows a single name
02:46 < TimToady> you'd have to write: subset C of Any where A & B
02:47 < [Coke]> rakudo: class A {}; class B {}; subset C of Any where A & B;
say C ~~ A; say C ~~ B # RT#70844
02:47 <+camelia> rakudo bfd850: OUTPUT«FalseFalse»
02:47 < TimToady> subset isn't about inheritance, except kinda by accident
02:48 < TimToady> if you want multiple inheritance, subset isn't the way to get
it
02:50 < [Coke]> rakudo: class A {}; class B {}; subset C of A|B; say C ~~ A;
say C ~~ B # RT#70844
02:50 <+camelia> rakudo bfd850: OUTPUT«TrueFalse»
02:50 < TimToady> "useless use of | in sink context"
02:54 < TimToady> we haven't had junctional types in Perl 6 for most of the
last 10 years
02:54 < [Coke]> ticket's from 2009
02:54 < TimToady> so someone was remembering the old days
02:55 < TimToady> junctional types were deemed to be impossible to understand,
and a general public nuisance
02:55 < TimToady> on top of which, we stole the syntax
02:56 < TimToady> since signatures can contain | or & that don't mean junctions
now
02:57 < TimToady> so I can pretty safely say that you'll never just be able to
throw A&B or A|B in where were currently parse a single type
02:59 < TimToady> I'd just close that one as Not a Bug
Rejecting as not a bug.
--
Will "Coke" Coleda