On 10/25/05, Larry Wall <[EMAIL PROTECTED]> wrote:
> We're probably converging on a general rule that two or more
> declarations of the same variable in the same scope refer to the
> same entity:
>
> my $x = 1; # outer $x;
> {
> $x = 2; # bound to OUTER::<$x>
> if my $x = foo() {...} # new $x declared here
> if my $x = bar() {...} # same $x, "my" is optional
> baz(); # baz sees single inner CALLER::<$x>.
> }
...
...
Cool!
> So too these would mean the same thing:
>
> sub Bool eqv (¢T $x, T $y) { my T $z; }
> sub Bool eqv (¢T $x, ¢T $y) { my ¢T $z; }
I like that symmetry between &foo and ¢foo. So to get the behavior
that an outer type variable applies to an inner sub, could I do this:
# a complicated identity function :-)
sub foo (¢T $x --> ¢T) {
my sub bar (T $z --> T) {
$z;
}
bar $x;
}
Because omitting the ¢ would not bind T. Whereas if I wrote:
sub foo (¢T $x --> ¢T) {
my sub bar (¢T $z --> T) {
$z;
}
bar $x;
}
It would be a totally new variable in both spots in the inner sub, and
if I wrote:
sub foo (¢T $x --> ¢T) {
my sub bar (T $z --> ¢T) {
$z;
}
bar $x;
}
It would be equivalent to:
sub foo (¢T $x --> ¢T) {
my sub bar (T $z --> ¢U) {
$z;
}
bar $z;
}
(Thus causing a "signature too general" type error)
Right? Totally off?
Luke