On Fri, 08 Sep 2017 21:13:59 -0700, b...@abrij.org wrote:
> On Wed, 23 Aug 2017 06:20:49 -0700, b...@abrij.org wrote:
> > On Mon, 24 Jul 2017 10:04:54 -0700, c...@zoffix.com wrote:
> > > The coercion works fine here:
> > >
> > > 17:03   Zoffix  m: class B {…}; class A { method B { B.new }}; class
> > > B
> > > {}; sub foo(B() $b) { say "hi" }; foo(A.new)
> > > 17:03   camelia         rakudo-moar 2fb8c7: OUTPUT: «hi?»
> > >
> > > But if I add `:D` smiley, it fails:
> > >
> > > 17:03   Zoffix  m: class B {…}; class A { method B { B.new }}; class
> > > B
> > > {}; sub foo(B:D() $b) { say "hi" }; foo(A.new)
> > > 17:03   camelia         rakudo-moar 2fb8c7: OUTPUT: «Type check
> > > failed
> > > in binding to parameter '$b'; expected B but got A (A.new)?  in sub
> > > foo at <tmp> line 1?  in block <unit> at <tmp> line 1??»
> > >
> > > https://irclog.perlgeek.de/perl6/2017-07-24#i_14915397
> > 
> > Seems to be more generic than custom classes:
> > 
> > $ perl6 -e 'sub foo(Int() $b) { say $b }; foo("42")'
> > 42
> > $ perl6 -e 'sub foo(Int:D() $b) { say $b }; foo("42")'
> > Type check failed in binding to parameter '$b'; expected Int but got
> > Str ("42")
> >   in sub foo at -e line 1
> >   in block <unit> at -e line 1
> > 
> > This raises the spec question, should e.g. IO:U($a) try to convert $a
> > to an IO,
> > and if that succeeds, succeed the bind with the type object of
> > whatever doer (or
> > subclass were IO a class) of IO which resulted?  Or fail the bind?
> > The latter is
> > more consistent with the above desired behavior... but does
> > "Class:D()" mean
> > coerce-to-then-check-definedness,  or go-all-out-to-make-a-defined-
> > value?
> > 
> > This doesn't make much sense yet either:
> > 
> > $ perl6 -e 'Int:D(4).say'
> > (Int:D)
> 
> 
> This ticket and RT#126433 can be combined.


I spent some more time digging into this.  There are a couple layers to this 
issue.

The first is a syntax conflict.  Consider (example from specs):

use Dog:auth(/:i jrandom/):ver(v1.2.1 | v1.3.4);

...in order to parse that the generic "extended identifier" syntax is allowed to
take a statement list as the value of a colonpair-in-a-name.  This is somewhat
more liberal than what is normally allowed in a coercion type.

Now in the S02, "extended identifiers" are said to only allow a
"subscript-like adverbial form", which would exclude parens as the circumfix,
so one solution to this would be to restrict the above syntax to
useish statements only, or some broader but still limited syntactic
category. There seems to be some logic for this already in token term:sym<name>,
but not in token typename, which is where this case ends up.

The second issue bears on the spec issue I raised above: if you do manage to
chop through the syntax issues, then you have to decide whether the class
coercion method that is called is named "B" or "B:D"... having separate
methods for all smiley types could be advantageous, but would be tedious.
Perhaps looking for "B:D" and if not found, calling "B" instead would be
something to consider here.

To pile on that, we get to the (NYI) behavior where the adverbial components
of an extended identifier are supposed to be orderless, along with the prospect
for compound smileys to be added later... cross that bridge when we get there I 
guess.

Reply via email to