Points about language support for 292
    Alex Buckley 
    Alex.Buckley at Sun.COM
       
    Fri May  1 10:57:00 PDT 2009
    
    
  
Rémi Forax wrote:
> Question: why do we need to use a type InvokeDynamic ?
> 
> The invokedynamic instruction is a function call,
> so I propose to use a syntax more close to a function call,
> something like:
> 
> $aDynamicFunction(arg1, arg2)
There are so many implications of blindly inventing this new syntax, I 
don't know where to start. Java doesn't have the concept of a function 
or a function call, so you need to define it. If the answer is "Function 
call just translates to an invokedynamic instruction", then you've 
introduced a new kind of expression where an existing one - method 
invocation - would do.
> Now, the problem of the return type.
> I propose the following rules:
> - if the dynamic call is the righ part of an assignation, the return type
>   is the type of the lhs.
>   int value = $aDynamicFunction(param1, param2)         // -> int
> 
> - if the dynamic call is prefixed by a cast, the return type is the
>  type of the cast (note that this rule doesn't exist for generics)
>  (double)$aDynamicFunction(param1, param2)         // -> double
> 
> - else the return type is Object.
You know I am suspicious of inference :-)
The cast idea is appealing at first but it breaks our old friend, 
Tennent's Correspondence Principle. You cannot write:
   int x = (int)InvokeDynamic.foo(..);
and later decide to introduce some abstraction:
   int x = (int)m();
   ...
   Object m() { return InvokeDynamic.foo(..); }
because Object doesn't cast to int very well.
Your method would have to be:
   InvokeDynamic m() { return (InvokeDynamic)InvokeDynamic.foo(...); }
which might be, well, alright, OK, it's not the end of the world.
A default return type of Object is well established, of course.
Alex
    
    
More information about the coin-dev
mailing list