--- Michael Lazzaro <[EMAIL PROTECTED]> wrote:
> On Thursday, March 13, 2003, at 01:05 PM, Austin Hastings wrote:
> > More to the point:
> >
> > type sigfunc is interrupt is reentrant;
> >
> > sub sig_ign() is sigfunc {...}
> > sub sig_kill() is sigfunc {...}
> > sub sig_intr() is sigfunc {...}
>
> This is WAGging based on A6, but I guess I see things like this as
> being implemented by making subs that inherit from subs:
>
> class sigfunc is sub (...default signature...) is interrupt is
> reentrant;
>
> sub sig_ign(...alternate signature...) is sigfunc {...}
> sub sig_kill is sigfunc {...}
> sub sig_intr is sigfunc {...}
>
> sigfunc sig_foo {...} # could you also say it like this, I
> wonder?
>
> Since C<sub> is itself a class, you can subclass it.
You are a bad, evil man for reminding me of this. I have yet to
brainvomit about stack-streams. (I have found an interesting analogy
between subs/blocks and streaming video compression, but it is too
large to fit in the margin :-)
> And since A6 indicates that the signature, traits, and even
> implementing body are just properties of a given C<sub> "object",
> you should be able to override them individually if you want, for
> example, an alternate signature. At least, I'm hoping something
> like that works -- there's a lot of guessing there.
Which reminds me that sigfuncs aren't is reentrant. They're but
reentrant.
my sub &foo = &sig_kill; # &foo is "but interrupt reentrant", too.
Which points in the direction of "sticky value traits", and "sticky
value traits" is a synonym for "class".
So you're right -- this case is a class extension. But then the
question becomes "how easy is it to override a class like this"?
> sub sig_kill is sigfunc {...}
> sub sig_intr is sigfunc {...}
>
> sigfunc sig_foo {...} # could you also say it like this, I
> wonder?
Well, no. That's going to look like a function returning a sigfunc.
Obviously we're walking on an edge-case. (Lucky for me that you're Mr.
Edge-Case, eh?)
> > type null but defined but false;
> >
> > ...
> > return undef but null;
>
> Hmm... I'm not entirely sure how that works for runtime properties...
>
> but what about
>
> class null is void but defined but false;
>
> return undef but null;
>
> Would something like that that be OK? Essentially using 'void' as a
> marker that you're defining a (heh) classless class? I'd really like
> to avoid making a separate keyword for combining traits, I'd love for
> it to just use the normal class inheritance mechanisms.
Cool if you can get it. But I want to be able to handle all sorts of
trait-contexts:
my macro sucks() is parsed(/<null>/) { "is slurpificatious" }
class foo_arg is rw is copy is coerced is optional;
sub foo( $v is foo_arg, @x is foo_arg sucks) {...}
=Austin