problem using gen-class and using the class name in the same file
Hi I try to compile a file that generate a class with gen-class that include class name at different places in the file here is a simplified version of the problem: lein init test-gen then edit the core.clj with -- (ns test-gen.core (:gen-class :name test-gen.Tata :init pre-init :constructors { [Integer] [Integer] [test-gen.Tata] [Integer] } ) ) (defn -pre-init [x] (test-gen.Tata. 9) 9) -- add :aot [test-gen.core] in project.clj then compile with lein compile: Compiling test-gen.core Exception in thread main java.lang.ClassNotFoundException: test-gen.Tata, compiling:(test_gen/core.clj:1) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6462) at clojure.lang.Compiler.analyze(Compiler.java:6262) at clojure.lang.Compiler.analyze(Compiler.java:6223) at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5618) at clojure.lang.Compiler$TryExpr$Parser.parse(Compiler.java:2136) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6455) at clojure.lang.Compiler.analyze(Compiler.java:6262) at clojure.lang.Compiler.analyze(Compiler.java:6223) at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5618) at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5054) at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3674) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6453) at clojure.lang.Compiler.analyze(Compiler.java:6262) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6443) at clojure.lang.Compiler.analyze(Compiler.java:6262) at clojure.lang.Compiler.analyze(Compiler.java:6223) at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3497) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6457) at clojure.lang.Compiler.analyze(Compiler.java:6262) at clojure.lang.Compiler.analyze(Compiler.java:6223) at clojure.lang.Compiler.compile1(Compiler.java:7030) at clojure.lang.Compiler.compile1(Compiler.java:7025) at clojure.lang.Compiler.compile(Compiler.java:7097) at clojure.lang.RT.compile(RT.java:387) at clojure.lang.RT.load(RT.java:427) at clojure.lang.RT.load(RT.java:400) at clojure.core$load$fn__4890.invoke(core.clj:5415) at clojure.core$load.doInvoke(core.clj:5414) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.core$load_one.invoke(core.clj:5227) at clojure.core$compile$fn__4895.invoke(core.clj:5426) at clojure.core$compile.invoke(core.clj:5425) at user$eval7.invoke(NO_SOURCE_FILE:1) at clojure.lang.Compiler.eval(Compiler.java:6511) at clojure.lang.Compiler.eval(Compiler.java:6501) at clojure.lang.Compiler.eval(Compiler.java:6477) at clojure.core$eval.invoke(core.clj:2797) at clojure.main$eval_opt.invoke(main.clj:297) at clojure.main$initialize.invoke(main.clj:316) at clojure.main$null_opt.invoke(main.clj:349) at clojure.main$main.doInvoke(main.clj:427) at clojure.lang.RestFn.invoke(RestFn.java:421) at clojure.lang.Var.invoke(Var.java:419) at clojure.lang.AFn.applyToHelper(AFn.java:163) at clojure.lang.Var.applyTo(Var.java:532) at clojure.main.main(main.java:37) Caused by: java.lang.ClassNotFoundException: test-gen.Tata at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at clojure.lang.DynamicClassLoader.findClass(DynamicClassLoader.java:61) at java.lang.ClassLoader.loadClass(ClassLoader.java:423) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:266) at clojure.lang.RT.classForName(RT.java:2039) at clojure.core$the_class.invoke(genclass.clj:99) at clojure.core$map$fn__4087.invoke(core.clj:2432) at clojure.lang.LazySeq.sval(LazySeq.java:42) at clojure.lang.LazySeq.seq(LazySeq.java:60) at clojure.lang.RT.seq(RT.java:473) at clojure.lang.RT.countFrom(RT.java:526) at clojure.lang.RT.count(RT.java:519) at clojure.core$generate_class$to_types__5402.invoke(genclass.clj:131) at clojure.core$generate_class.invoke(genclass.clj:293) at clojure.core$gen_class.doInvoke(genclass.clj:622) at clojure.lang.RestFn.invoke(RestFn.java:1557) at clojure.lang.Var.invoke(Var.java:477) at clojure.lang.AFn.applyToHelper(AFn.java:277) at clojure.lang.Var.applyTo(Var.java:532) at clojure.lang.Compiler.macroexpand1(Compiler.java:6366) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6441) ... 45 more Compilation failed: Subprocess failed The problem seems to be that i am using a class that doesn't exist yet. If i comment all lines referring to test-gen.Tata; compile; uncommment those lines; compile; again then it works. Is there a way a better to
Re: problem using gen-class and using the class name in the same file
Yes exactly, i need a constructor which require an instance of the same class as parameter and i need to create new instances of this class in some methods (i implement an abstract class that require this). Le mercredi 12 juin 2013 10:54:15 UTC+2, Kelker Ryan a écrit : There are two things that I've notice about your code that could probably be the cause. In the :constructors section of :gen-class, you're refering to test-gen.Tata although it doesn't exist yet. The -pre-init function also tries to call a class that doesn't exist yet. 12.06.2013, 16:39, Armel Esnault armel@gmail.com javascript:: Hi I try to compile a file that generate a class with gen-class that include class name at different places in the file here is a simplified version of the problem: lein init test-gen then edit the core.clj with -- (ns test-gen.core (:gen-class :name test-gen.Tata :init pre-init :constructors { [Integer] [Integer] [test-gen.Tata] [Integer] } ) ) (defn -pre-init [x] (test-gen.Tata. 9) 9) -- add :aot [test-gen.core] in project.clj then compile with lein compile: Compiling test-gen.core Exception in thread main java.lang.ClassNotFoundException: test-gen.Tata, compiling:(test_gen/core.clj:1) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6462) at clojure.lang.Compiler.analyze(Compiler.java:6262) at clojure.lang.Compiler.analyze(Compiler.java:6223) at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5618) at clojure.lang.Compiler$TryExpr$Parser.parse(Compiler.java:2136) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6455) at clojure.lang.Compiler.analyze(Compiler.java:6262) at clojure.lang.Compiler.analyze(Compiler.java:6223) at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5618) at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5054) at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3674) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6453) at clojure.lang.Compiler.analyze(Compiler.java:6262) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6443) at clojure.lang.Compiler.analyze(Compiler.java:6262) at clojure.lang.Compiler.analyze(Compiler.java:6223) at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3497) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6457) at clojure.lang.Compiler.analyze(Compiler.java:6262) at clojure.lang.Compiler.analyze(Compiler.java:6223) at clojure.lang.Compiler.compile1(Compiler.java:7030) at clojure.lang.Compiler.compile1(Compiler.java:7025) at clojure.lang.Compiler.compile(Compiler.java:7097) at clojure.lang.RT.compile(RT.java:387) at clojure.lang.RT.load(RT.java:427) at clojure.lang.RT.load(RT.java:400) at clojure.core$load$fn__4890.invoke(core.clj:5415) at clojure.core$load.doInvoke(core.clj:5414) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.core$load_one.invoke(core.clj:5227) at clojure.core$compile$fn__4895.invoke(core.clj:5426) at clojure.core$compile.invoke(core.clj:5425) at user$eval7.invoke(NO_SOURCE_FILE:1) at clojure.lang.Compiler.eval(Compiler.java:6511) at clojure.lang.Compiler.eval(Compiler.java:6501) at clojure.lang.Compiler.eval(Compiler.java:6477) at clojure.core$eval.invoke(core.clj:2797) at clojure.main$eval_opt.invoke(main.clj:297) at clojure.main$initialize.invoke(main.clj:316) at clojure.main$null_opt.invoke(main.clj:349) at clojure.main$main.doInvoke(main.clj:427) at clojure.lang.RestFn.invoke(RestFn.java:421) at clojure.lang.Var.invoke(Var.java:419) at clojure.lang.AFn.applyToHelper(AFn.java:163) at clojure.lang.Var.applyTo(Var.java:532) at clojure.main.main(main.java:37) Caused by: java.lang.ClassNotFoundException: test-gen.Tata at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at clojure.lang.DynamicClassLoader.findClass(DynamicClassLoader.java:61) at java.lang.ClassLoader.loadClass(ClassLoader.java:423) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:266) at clojure.lang.RT.classForName(RT.java:2039) at clojure.core$the_class.invoke(genclass.clj:99) at clojure.core$map$fn__4087.invoke(core.clj:2432) at clojure.lang.LazySeq.sval(LazySeq.java:42) at clojure.lang.LazySeq.seq(LazySeq.java:60) at clojure.lang.RT.seq(RT.java:473) at clojure.lang.RT.countFrom(RT.java:526) at clojure.lang.RT.count(RT.java:519) at clojure.core$generate_class$to_types__5402.invoke
Re: problem using gen-class and using the class name in the same file
It seems that only the constructor is the problem. it there is workaround to solve this ? I have several gen-class calls each need a constructor with an instance of the same class as parameter. Le mercredi 12 juin 2013 11:14:56 UTC+2, Meikel Brandmeyer (kotarak) a écrit : Hi, test-gen.Tata should probably be test_gen.Tata everywhere. The reference in the pre-init function should be fine, because the defn is compiled after the generated class is in place. Meikel -- -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.
Re: problem using gen-class and using the class name in the same file
i made the same test without any - or _ the problem is still there Le mercredi 12 juin 2013 11:30:33 UTC+2, Meikel Brandmeyer (kotarak) a écrit : Did you check the spelling? - is not valid in a package name. AFAIR using the classname there should work. Meikel 2013/6/12 Armel Esnault armel@gmail.com javascript: It seems that only the constructor is the problem. it there is workaround to solve this ? I have several gen-class calls each need a constructor with an instance of the same class as parameter. Le mercredi 12 juin 2013 11:14:56 UTC+2, Meikel Brandmeyer (kotarak) a écrit : Hi, test-gen.Tata should probably be test_gen.Tata everywhere. The reference in the pre-init function should be fine, because the defn is compiled after the generated class is in place. Meikel -- -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clo...@googlegroups.comjavascript: Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+u...@googlegroups.com javascript: For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to a topic in the Google Groups Clojure group. To unsubscribe from this topic, visit https://groups.google.com/d/topic/clojure/ww7hBtwdhoE/unsubscribe?hl=en. To unsubscribe from this group and all its topics, send an email to clojure+u...@googlegroups.com javascript:. For more options, visit https://groups.google.com/groups/opt_out. -- -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.
Re: problem using gen-class and using the class name in the same file
It works for me!! Thanks josh, meikel and kelker for your answers. Le mercredi 12 juin 2013 18:10:37 UTC+2, joshro...@gmail.com a écrit : I was messing around recently with creating a Builder class using gen-class and ran into the same issue since each set* method returns this. I'm pretty sure it's a chicken and egg issue: the class doesn't exist yet but you need to specify it in the gen-class ... I reworked your example a little bit, see if this fixes the problem: https://www.refheap.com/15708 and https://www.refheap.com/15709 I used Object in gen-class, and then check the type in the init. Josh -- -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.