On Thu, Jul 28, 2005 at 05:57:28AM +0800, Autrijus Tang wrote: > On Thu, Jul 28, 2005 at 05:03:05AM +0800, Autrijus Tang wrote: > > Hence, it seems to me that there are only four ways out: > > Some annotations copied from discussion in #perl6:
Last time I reply to myself on this thread, hopefully. :-)
> > B) Omit the #2 check from both compile time and runtime; this allows
> > us to write the "returns All" version.
> >
> > At compile time, check for #3: All.does(Str)
> > At runtime, check for #3: "abc".does(Str)
>
> This is quite absurd, and was included only for completeness.
On second thought, this is not as absurd as it seems. This view is that
"sub f () returns Foo" means "f() can be used in any place that a Foo
literal can occur", which means that it can be used in contexts that
demands a supertype of Foo (like Any), but never a subtype of Foo.
The language defined this way would still be dynamic; disabling #2 means
that the type of $x will not be checked against Foo upon return($x), so
anything at all can be used in that position. Meaningful type errors
can occur, for example when saying close(length("abc")), where length
would have "returns Int" and close have a "IO" parameter.
However, this does require the curious device of "returns All" as the
default return type, unless we eliminate that using type variables
and/or type inferencing, at which time we can get #2 back for free and
implement full static typechecking anyway.
Thanks,
/Autrius/
pgpaH5X3qHeTw.pgp
Description: PGP signature
