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