On Tue, Mar 25, 2003 at 01:47:32PM -0800, Michael Lazzaro wrote:
>
> On Tuesday, March 25, 2003, at 11:08 AM, Jonathan Scott Duff wrote:
>
> > On Tue, Mar 25, 2003 at 10:42:39AM -0800, Michael Lazzaro wrote:
> >> But it is certainly possible to extend the initialization capabilities
> >> to be more robust:
> >>
> >> sub foo($x = 'blah') {...} # wrong: use one of the below
> >> sub foo($x ::= 'blah') {...} # same as C<$x is default('blah')>
> >> sub foo($x //= 'blah') {...} # sets $x whenever $x is undefined
> >> sub foo($x ||= 'blah') {...} # sets $x whenever $x is false
> >
> > While this looks pretty in email, it makes me wonder what the ::
> > operator does outside of regular expressions and how that operator
> > interacts with ??::
>
> Well, := is the binding operator, and ::= is the "compile-time" binding
> operator.
Interesting. When juxtaposed against //= and ||= it looks more like
"bind unless already bound" to me.
> I'm arguing for these three defaulting options in particular, but my
> more encompassing argument is the wrapper-like notion that signatures
> should be able to specify assertions, invariants, and initializations
> that may then be "inherited" by all implementations of that
> function/method.
Don't we already have the pre() trait and PRE block for this?
> Placing such extensive capabilities in the sig is especially useful if
> we can 'typecast' subs, as others have pointed out.
>
> class mysub is sub(...big long signature...) returns int {...}
> sub foo is mysub { ... }
> sub bar is mysub { ... }
>
> If ...big long signature... contains initializations and assertions
> that are required to be shared by all sub implementations, than it
> makes the sig a quite powerful thing. Sure, a complex sig could be
> pretty big. But it's one big thing, as opposed to repeating the same
> assertions in N implementations.
>From A6:
sub Num foo (int $one, Str [EMAIL PROTECTED]) { return [EMAIL PROTECTED] }
is short for saying something like:
sub foo is signature( sig(int $one, Str [EMAIL PROTECTED]) )
is returns( sig(Num) )
will do { return [EMAIL PROTECTED] }
So, it seems to me that we might be able to do something like this:
$sig = sig(...big long signature...);
&presub = { ...initializations, etc. ... };
sub foo is signature($sig) is pre(&presub) { ... }
sub bar is signature($sig) is pre(&presub) { ... }
Resisting assignment in signatures (for now),
-Scott
--
Jonathan Scott Duff
[EMAIL PROTECTED]