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

Reply via email to