"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