Excuse me, please, may be this is a naive question. As I understand, we want to call Clojure from Java when we want to use advantages of implementation of some functionality in Clojure. But, in this example I see implementation of the functionallity in Java. Am I right?
понедельник, 10 июня 2019 г., 7:21:28 UTC+3 пользователь Alex Miller написал: > > Looks like the title for this is backwards if I understand the intent, > should be calling Clojure from Java, right? > > Java code is going to invoke methods on classes (that's all it knows how > to do). You have several options: > > 1) Use the Clojure Java API to invoke the Clojure runtime - here you're > leveraging the Clojure runtime's Java impl core to call into Clojure (Stu's > example) > 2) Use protocols, records, and/or genclass to actually produce Java > classes (your example, I think). > 3) Define your interface as a set of Java interfaces. Implement this > interface in Clojure. You will need a small amount of glue code to provide > the API impl (some kind of a factory to give you the impl of the Java > interface - either written in Java or using #1). > > #1 is straightforward but tedious - it's really only worthwhile if you > have a small amount of this code and hide the use of it. > #2 has significant downsides - needing to compile everything, all methods > are just going to take/return Java Objects, no javadoc on apis, etc. > #3 has advantages in all those areas. You write your Java interface where > you can best write it ... in Java (with Javadoc, and Java interfaces, and > all the niceties Java users want). IDEs can autocomplete on the Java > interfaces. You don't have to AOT - factories can reify or load protocol > instances as needed as they return objects. You can even reload internal > vars with a connected REPL without restarting the app. > > The last does take a bit of planning to set up - you need API code (in > Java), and Clojure code that relies on that Java code. lein makes it pretty > trivial to put those in one project and compile in that order. > > I pushed an example up here: > > https://github.com/puredanger/clojure-from-java > > It defines a Java interface (java/cfj/Event.java > <https://github.com/puredanger/clojure-from-java/blob/master/java/cfj/Event.java>), > > a static helper to hook the Clojure (java/cfj/Support.java > <https://github.com/puredanger/clojure-from-java/blob/master/java/cfj/Support.java>), > > which uses the Clojure Java API to load the Clojure instance in > clj/core/cfj.clj > <https://github.com/puredanger/clojure-from-java/blob/master/src/cfj/core.clj>. > > Just `lein uberjar` and you're done. Use the Support API from Java as any > other Java class. No AOT required. > > > > On Sunday, June 9, 2019 at 9:53:56 PM UTC-5, eglue wrote: >> >> I've been stalking Clojure for a while but now doing it professionally >> full-time (woo hoo!). >> >> I saw a Stuart Halloway tweet responding to someone who'd found it a >> "soul-crushing, miserable experience." >> >> I had a similar miserable experience and figured it was just me, but am >> now suspecting that's not the case. (Happy to be shown the light however.) >> >> Stuart H posted https://github.com/stuarthalloway/clojure-from-java >> <https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fstuarthalloway%2Fclojure-from-java&sa=D&sntz=1&usg=AFQjCNFxHASS9MQ07WZ5St1GE9g1WckHFg> >> to >> demonstrate the ease of Java consuming Clojure, but I find it far more >> important to be able to *compile* Java against Clojure interfaces not >> invoke it dynamically from Java....because dynamic invocation from Java is >> unwieldy to the point of it being a likely deal breaker for any Java shop. >> Dynamically loading classes and invoking methods.... c'mon, no one's going >> to ask their Java devs to do this. >> >> If Clojure doesn't have a good compile-time consumption story for Java >> consumers, I think that's a loss. (Even if it is just providing better docs >> or archetype/bootstrap examples in this regard.) Because otherwise Java >> code bases around the world could be eaten away by (compiled) Clojure from >> the inside out, giving Java dev teams enough time to be overtaken by the >> miracle that is Clojure. >> >> Inspired by Stuart's example, I was successful in putting together a >> quick build to achieve this ideal: >> https://github.com/atdixon/clojure-from-java >> <https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fatdixon%2Fclojure-from-java&sa=D&sntz=1&usg=AFQjCNG0DEccFtsm0Norw4jQ_qw-dezdZw> >> >> However, I have a few open questions: >> >> - when I tried to AOT only the public-facing clojure code that I needed >> to compile against, I found out at runtime that this wasn't going to work. >> Dynamic clojure code was loading my same types into DynamicClassLoader and >> when my statically-compiled, root-class-loaded code was getting executed >> the ClassCastExceptions of course were flying. So am I right to think that >> you have to AOT everything in order to do this right? >> - IDE support (for me, Cursive) "works" but is non-ideal; you have to >> manually compile the dependee/Clojure jar, then Cursive will let you >> execute Java code against the manually aot-compiled Clojure code >> - AOT producing generics/generic types doens't seem to be part of any of >> this... is this a lacuna in the Clojure AOT space, are there libs that can >> help here? >> >> This story ^^, if made easier, seems to me would boost Clojure adoption >> in Java/JVM shops. >> >> What am I missing? >> >> >> -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/clojure/97c2518a-2517-4684-8487-ff87f653c637%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.