On Sat, Apr 30, 2005 at 09:13:26AM -0500, Abhijit Mahabal wrote:
> On Fri, 29 Apr 2005, Brent 'Dax' Royal-Gordon wrote:
>
> >David Storrs <[EMAIL PROTECTED]> wrote:
> >>Could we see some code that shows why this is a good idea? My initial
> >>reaction is horror; I can very easily see huge numbers of subtle,
> >>hard-to-reproduce bugs coming out of this.
> >>I'm quite willing to believe that there are [good results], but I'm not
> >>coming up with them.
> >What do you think this is?
> >
> > sub foo(Str | Int $bar) { ... }
>
> I believe you mean sub foo(Str^Int $bar){...} ( something that is Int or
> Str but not both). But that, too, just reduces the amount of code and is
> merely a shortcut for:
> multi sub(Str $bar){...}
> multi sub(Int $bar){...}
>
> 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.
Indeed, you're right on the money, Abhijit. Thanks for stating it so
well.
Let's move this away from simple types like Str and Int for a moment.
Tell me what this does:
class Tree {
method bark() { die "Cannot instantiate a Tree--it is abstract!" }
}
class Birch {
method bark() { return "White, papery" }
}
class Oak {
method bark() { return "Dark, heavy" }
}
class Dog {
method bark() { print "Woof, woof!"; return "bow wow" }
}
class AlienBeastie isa Tree isa Dog {}
class WhiteAlienBeastie isa Birch isa Dog {}
class HeavyAlienBeastie isa Oak isa Dog {}
sub Foo(Tree|Dog $x) { $x.bark() }
Ignore for the moment that this is stupid code--it's semantically and
(AFAIK) syntactically valid. So, what happens when I do each of these:
Foo( new AlienBeastie() );
Foo( new WhiteAlienBeastie() );
Foo( new HeavyAlienBeastie() );
??
--Dks