I tried this approach, and it works great. I had to spin the call to main.main() in another thread, but that's expected.
What I didn't expect is that when I try to close the LineNumberingPushbackReader (to end the repl), I get infinite exceptions: java.io.IOException: Stream closed java.io.IOException: Stream closed java.io.IOException: Stream closed ... It appears that somewhere in the repl loop it's trying to do a read (or possibly unread in skip-whitespace?), printing the exception, but then not registering that it should exit, and then keeps trying to read again. I haven't really followed the code to see where the problem lies, but let me pose this question anyways: what's the best way to close the repl? I can't call (System/exit 0), 'cause the whole thing will come down. I thought calling LNPR.close() on the input Reader would be like sending Ctrl-D to the console, but either I'm doing it wrong or that doesn't work for some reason. Any ideas? I love this simple approach, I didn't have to munge hardly any code (I had been traveling down the "replace :read and :print and :prompt and :flush and..." path, and it wasn't as pretty as I hoped). Thanks in advance... Mike On Dec 7, 7:26 pm, Liam <liam.ga...@gmail.com> wrote: > I think the following is “looked down upon” or “discouraged“, but I > managed to sift through how clojure itself handles its own stuff in > java and I came up with the following. > > Say, that you want to set *out*, *in*, and *err* in clojure to > something from Java before starting a REPL. Here is how I passed on > these values to the clojure RT: > > try { > Var.pushThreadBindings(RT.map( > RT.OUT, new OutputStreamWriter(MYout), > RT.IN, new LineNumberingPushbackReader(new InputStreamReader(MYin)), > RT.ERR, new PrintWriter(new OutputStreamWriter(MYout), true))); > > main.main(new String[] {"-r"}); > > } catch (Exception e) {} > > finally { > Var.popThreadBindings(); > > } > > Don’t forget to import (after setting clojure.jar on the cp). > import clojure.main; > import clojure.lang.RT; > import clojure.lang.Var; > > Note that the doc-string of the clojure (repl function allows for > hooks for some of what you want. You just need to look into how you > could pass on those functions for :need- > prompt, :prompt, :flush, :read in a way that clojure can digest, which > I think is just a Runnable in a map of sorts. But you’ll have to look > into that to be sure. > > Regardless, I highly recommend that you separate Java from clojure > coding as mush as possible, or at least treat clojure in a functional > way when touching it from Java. > > I hope this helps. If someone else has a better way, I’m all ears. > > On Dec 7, 8:19 am, Mike <cki...@gmail.com> wrote: > > > I've seen an example of launching a Clojure script from Java (http:// > > en.wikibooks.org/wiki/Clojure_Programming/ > > Tutorials_and_Tips#Invoking_Clojure_from_Java), but I've got an > > application in which I'd like to run a REPL. > > > My app has its own JPanel for display results, and a text area for > > input, so I'll need to start repl with some replacement callback > > functions (read, print, prompt, need-prompt). I'd like to code as > > much as possible in Clojure, but at some point I need to pass in some > > Java object instances that my wrapper functions will use to perform I/ > > O for the repl. > > > Has anyone done this recently? Could someone point me in the right > > direction for exposing Java objects into Clojure? I've tried reading > > main.java and RT.java looking for hints, but I'm not too smart yet > > about the Clojure environment, the scope of when things live, and > > such. > > > Thanks in advance for any hints... > > Mike -- 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