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

Reply via email to