Close the *out* stream, not the *in*. That should do it.
(. *out* close)

It was fun watching that the first time it happend to me.

;-)


On Dec 8, 11:26 am, Mike <cki...@gmail.com> wrote:
> 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- Hide quoted text -
>
> - Show quoted text -

-- 
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