"Recursive" lambda makes the compiler crash

Grégoire Neuville gregoire.neuville at gmail.com
Sat Jul 20 04:00:31 PDT 2013


Hello,

The following code :

public static <A, B> F<Stream<A>, Promise<B>> foldRightS(final
Strategy<Unit> s, final F<A, F<P1<B>, B>> f, final B b) {

    final class Folder {
        final F<Stream<A>, Promise<B>> foldr = as -> as.isEmpty() ?
                promise(s, P.p(b)) :
                liftM2(f).f(promise(s, P.p(as.head())))
                        .f(Promise.<P1<B>>join(s, () ->
foldr.f(as.tail()._1()).fmap(P.p1())));
    }

    return new Folder().foldr;
}

makes the compile crash (cf. stack trace below).

That one however :

public static <A, B> F<Stream<A>, Promise<B>> foldRightS(final
Strategy<Unit> s, final F<A, F<P1<B>, B>> f, final B b) {

    final F<Stream<A>, Promise<B>> foldr = new F<Stream<A>, Promise<B>>() {
        final F<Stream<A>, Promise<B>> self = this;
        public Promise<B> f(Stream<A> as) {
            return as.isEmpty() ?
                promise(s, P.p(b)) :
                liftM2(f).f(promise(s, P.p(as.head())))
                    .f(Promise.<P1<B>>join(s, () ->
self.f(as.tail()._1()).fmap(P.p1())));
        }
    };

    return foldr;
}

compiles fine.

Hope that'll help

Grégoire Neuville.

Stack trace on crash :

java.lang.ClassCastException: com.sun.tools.javac.code.Symbol$ClassSymbol
cannot be cast to com.sun.tools.javac.code.Symbol$MethodSymbol
at
com.sun.tools.javac.comp.LambdaToMethod.visitLambda(LambdaToMethod.java:259)
at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1609)
at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
at
com.sun.tools.javac.comp.LambdaToMethod.translate(LambdaToMethod.java:190)
at
com.sun.tools.javac.comp.LambdaToMethod.translate(LambdaToMethod.java:183)
at
com.sun.tools.javac.tree.TreeTranslator.visitVarDef(TreeTranslator.java:153)
at
com.sun.tools.javac.comp.LambdaToMethod.visitVarDef(LambdaToMethod.java:448)
at com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:846)
at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
at
com.sun.tools.javac.comp.LambdaToMethod.translate(LambdaToMethod.java:190)
at
com.sun.tools.javac.comp.LambdaToMethod.translate(LambdaToMethod.java:183)
at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
at
com.sun.tools.javac.tree.TreeTranslator.visitClassDef(TreeTranslator.java:134)
at
com.sun.tools.javac.comp.LambdaToMethod.visitClassDef(LambdaToMethod.java:230)
at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:687)
at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
at
com.sun.tools.javac.comp.LambdaToMethod.translate(LambdaToMethod.java:190)
at
com.sun.tools.javac.comp.LambdaToMethod.translate(LambdaToMethod.java:183)
at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
at
com.sun.tools.javac.tree.TreeTranslator.visitBlock(TreeTranslator.java:162)
at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:903)
at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
at
com.sun.tools.javac.comp.LambdaToMethod.translate(LambdaToMethod.java:190)
at
com.sun.tools.javac.comp.LambdaToMethod.translate(LambdaToMethod.java:183)
at
com.sun.tools.javac.tree.TreeTranslator.visitMethodDef(TreeTranslator.java:145)
at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:772)
at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
at
com.sun.tools.javac.comp.LambdaToMethod.translate(LambdaToMethod.java:190)
at
com.sun.tools.javac.comp.LambdaToMethod.translate(LambdaToMethod.java:183)
at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
at
com.sun.tools.javac.tree.TreeTranslator.visitClassDef(TreeTranslator.java:134)
at
com.sun.tools.javac.comp.LambdaToMethod.visitClassDef(LambdaToMethod.java:230)
at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:687)
at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
at
com.sun.tools.javac.comp.LambdaToMethod.translate(LambdaToMethod.java:190)
at
com.sun.tools.javac.comp.LambdaToMethod.translate(LambdaToMethod.java:183)
at
com.sun.tools.javac.comp.LambdaToMethod.translateTopLevelClass(LambdaToMethod.java:210)
at com.sun.tools.javac.main.JavaCompiler.desugar(JavaCompiler.java:1442)
at com.sun.tools.javac.main.JavaCompiler.desugar(JavaCompiler.java:1327)
at com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:877)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:836)
at com.sun.tools.javac.main.Main.compile(Main.java:517)
at com.sun.tools.javac.main.Main.compile(Main.java:376)
at com.sun.tools.javac.main.Main.compile(Main.java:365)
at com.sun.tools.javac.main.Main.compile(Main.java:356)
at com.sun.tools.javac.Main.compile(Main.java:77)
at com.sun.tools.javac.Main.main(Main.java:62)


More information about the lambda-dev mailing list