Just surfing, I noticed something about the "D" programming language:
"
The types of constants need not be specified explicitly as the compiler
infers their types <http://en.wikipedia.org/wiki/Type_inference> from
the right-hand sides of assignments.
const fact_7 = Factorial!(7);
"
Now in C++, templates can be used to make function return types go along
with their argument types, for generic arguments.
In Perl 6, I think you would have to arrange to write the return type
later rather than sooner to do this:
sub foo (::T $a, T $b)
is of T
and writing it the other way around would violate the one-pass parsing.
So, how would you write the constant above in Perl 6, without knowing
specifically what foo returned? I'm thinking of a situation where you
have foo as a method of a generic class, or otherwise depends on a
generic type parameter already. But, it could be an expression not just
a function call, and depend on the generic types present in outer scopes
in a less-than-simple way.
my Type $x = $a ⊗ $b;
With C++, I would have to hope that the template writer thought to give
the return type of that function a snappy name, rather than just
referring to it as an inline conglomeration that involves the generic types.
The compiler knows what that type is. How do I refer to it? Can I say,
"declare $x to be the type of the right-hand-side", rather than making
me name it and checking that I got it right, or leaving it off and not
having compile-time checking and optimization for subsequent use of $x ?
Here's an idea: a pseudo-type of the form ::?RHSTYPE.
I could even capture it for subsequent use, like with generic type
parameters:
my ::?RHSTYPE ::ProdType $x = $a ⊗ $b;
my ProdType $y = $x;
--John