On Sat, 2005-04-30 at 22:24 +0800, Autrijus Tang wrote:
> On Sat, Apr 30, 2005 at 09:13:26AM -0500, Abhijit Mahabal wrote:
> > I do not see how any auto-threading occurs in that code. It is completely
> > innocuous in that sense, and I don't think that is what horrified David.
> > What was troublesome was, I think:
> > my Str|Int $x;
> > $x.foo(); # runs two methods and returns a junction
>
> That would be absolutely horrible.
Then tell me what $!.can("chars") returns, assuming that $! is
implemented as an "any" junction of Int and Str values? My take would be
that it returns false|true, which is true in a boolean context, but feel
free to talk me out of it.
Str|Int is simply the type of "Yes"|1, isn't it? That would certainly
make signature matching on different kinds of junctive types trivial.
> > I would like to be able to read the above code to mean:
> > type X ::= Scalar where Str|Int;
> > my X $x; # $x = non int/non string now a runtime error
> > $x.foo(); # no different from if you had just said my $x
>
> This is my current understanding in the implementation.
That's not a junction, and thus should not use junction syntax.
I'm not opposed to having such a construct, but re-using junction syntax
is going to cause massive headaches for anyone trying to learn the
language.
Also, what is:
$x = ::("Int") | ::("Str")
my ::($x) $y;
at which stages of the execution of that code? Are you saying that $x
does not contain a junction, or that a junction used as a type does not
create a junction value?
If the latter, then what is the type of "Yes"|1?