lambda/lambda/langtools: initial lambda push; the current prototype suuports the following features:

maurizio cimadamore maurizio.cimadamore at oracle.com
Sat May 29 15:23:00 PDT 2010


On 29/05/2010 15:14, Rémi Forax wrote:
> I've tried a swearword but legal:
>
> #()(#(){}).();
Hey, congrats! This one wins the 'lambda of the week' award hands down! ;-)

Maurizio
>
> The compiler knows more slang words than me :)
>
> Rémi
>
> An exception has occurred in the compiler (1.7.0-internal). Please 
> file a bug at the Java Developer Connection 
> (http://java.sun.com/webapps/bugreport)  after checking the Bug Parade 
> for duplicates. Include your program and the following diagnostic in 
> your report.  Thank you.
> java.lang.NullPointerException
>     at com.sun.tools.javac.comp.Lower.lambdaName(Lower.java:3400)
>     at com.sun.tools.javac.comp.Lower.visitLambda(Lower.java:3404)
>     at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1452)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1958)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1970)
>     at com.sun.tools.javac.comp.Lower.visitReturn(Lower.java:3155)
>     at com.sun.tools.javac.tree.JCTree$JCReturn.accept(JCTree.java:1230)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1958)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.visitBlock(TreeTranslator.java:160) 
>
>     at com.sun.tools.javac.comp.Lower.visitBlock(Lower.java:3128)
>     at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:780)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1958)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.visitMethodDef(TreeTranslator.java:144) 
>
>     at 
> com.sun.tools.javac.comp.Lower.visitMethodDefInternal(Lower.java:2407)
>     at com.sun.tools.javac.comp.Lower.visitMethodDef(Lower.java:2326)
>     at 
> com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:667)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1958)
>     at com.sun.tools.javac.comp.Lower.visitLambda(Lower.java:3466)
>     at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1452)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1958)
>     at com.sun.tools.javac.comp.Lower.visitSelect(Lower.java:3538)
>     at 
> com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1727)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1958)
>     at com.sun.tools.javac.comp.Lower.visitApply(Lower.java:2625)
>     at 
> com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1311) 
>
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1958)
>     at com.sun.tools.javac.comp.Lower.visitTypeCast(Lower.java:2422)
>     at 
> com.sun.tools.javac.tree.JCTree$JCTypeCast.accept(JCTree.java:1644)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1958)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1970)
>     at com.sun.tools.javac.comp.Lower.visitLambdaCall(Lower.java:2651)
>     at com.sun.tools.javac.comp.Lower.visitApply(Lower.java:2563)
>     at 
> com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1311) 
>
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1958)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.visitExec(TreeTranslator.java:242) 
>
>     at 
> com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1157) 
>
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1958)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.visitBlock(TreeTranslator.java:160) 
>
>     at com.sun.tools.javac.comp.Lower.visitBlock(Lower.java:3128)
>     at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:780)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1958)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.visitMethodDef(TreeTranslator.java:144) 
>
>     at 
> com.sun.tools.javac.comp.Lower.visitMethodDefInternal(Lower.java:2407)
>     at com.sun.tools.javac.comp.Lower.visitMethodDef(Lower.java:2326)
>     at 
> com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:667)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1958)
>     at com.sun.tools.javac.comp.Lower.visitClassDef(Lower.java:2064)
>     at 
> com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:596)
>     at 
> com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1958)
>     at com.sun.tools.javac.comp.Lower.translate(Lower.java:1978)
>     at 
> com.sun.tools.javac.comp.Lower.translateTopLevelClass(Lower.java:3589)
>     at 
> com.sun.tools.javac.main.JavaCompiler.desugar(JavaCompiler.java:1328)
>     at 
> com.sun.tools.javac.main.JavaCompiler.desugar(JavaCompiler.java:1206)
>     at 
> com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:842)
>     at 
> com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:801)
>     at com.sun.tools.javac.main.Main.compile(Main.java:412)
>     at com.sun.tools.javac.main.Main.compile(Main.java:330)
>     at com.sun.tools.javac.main.Main.compile(Main.java:321)
>     at com.sun.tools.javac.Main.compile(Main.java:82)
>     at com.sun.tools.javac.Main.main(Main.java:67)
>
>
>
> Le 28/05/2010 17:04, Maurizio Cimadamore a écrit :
>> On 28/05/10 15:40, Rémi Forax wrote:
>>> I've found some bugs :)
>>>
>>> // this doesn't compile - how to declare a function type that 
>>> doesn't takes any parameter ?
>>> #int() bar;
>>
>> I'm in the process of fixing this...
>>>
>>>
>>> // in my opinion, an instruction can start with a lambda that has a 
>>> body,
>>> // but the hand-coded grammar of the compiler doesn't allow that.
>>> #(int x) { System.out.println(x); }.();
>>>
>>> // Open question: can an instruction starts with a lambda expression ?
>> Good question; my choice has been to make lambda a plain expression, 
>> rather than an expression statement; this way it is mandatory to 
>> always wrap a lambda either within a function type or within a SAM type.
>>>
>>>
>>> // this snippet generate invalid code (at bytecode offset 4)
>>> int v = #(Object o) {
>>>   System.out.println(this.type());
>>>   return 3;
>>> }.("foo");
>>
>> the .type() syntax is not supported yet, hence the bad bytecode.
>>
>> Thanks for the headsup!
>>
>> Maurizio
>>
>>>
>>> static int lambda$0(java.dyn.MethodHandle, java.lang.Object);
>>>     Code:
>>>        0: getstatic     #1          // Field 
>>> java/lang/System.out:Ljava/io/PrintStream;
>>>        3: aload_0
>>>        4: invokevirtual #2       // Method 
>>> "".type:()Ljava/dyn/MethodType;
>>>        7: invokevirtual #3       // Method 
>>> java/io/PrintStream.println:(Ljava/lang/Object;)V
>>>       10: iconst_3
>>>       11: ireturn
>>>
>>>
>>> Rémi
>>>
>>
>



More information about the lambda-dev mailing list