On Feb 9, 2009, at 2:13 PM, Rich Hickey wrote:

On Feb 9, 2:10 pm, Thorsen Eric <ethor...@enclojure.org> wrote:
For some reason I could not reply to the original thread...

Begin forwarded message:

From: "Stephen C. Gilardi" <squee...@mac.com>
Date: February 6, 2009 12:49:34 PM EST
To: Eric Thorsen <ethor...@enclojure.org>
Subject: Re: Patch: universal main() with repl/script/compile

Hi Eric,

I've been using the repl in clojure,main (which is great, BTW) but I

Thanks!

have a question as to why the main loop is not a "pure" REPL?
I am able to substitute all parts except that the *in* stream is
mucked with in the loop with the skip-whitepace and skip-if-eol which
means if I do not want that stuff to happen, I am out of luck.  Can
you shed some light on the problem you were trying to solve there and whether or not that logic can be moved into the default read function
instead of being inside the loop?

Regarding skip-whitespace:

Good questions. clojure.core/read already does skip-whitespace
internally so you won't be avoiding that as long as you use it. The
downside of clojure.core/read doing that (rather than something I
control in the repl) is that clojure.core/read doesn't return at end-
of-line. One goal of making a nicer repl was to prompt for each
line: if the user types a blank line, give another prompt. That
isn't possible if I leave the current clojure.core/read in charge of
skipping whitespace. It considers the end-of-line as just more
whitespace and continues skipping.

Another goal was not to prompt again if there's more input on the
same line. Arguably, printing only the last value on the line would
also be correct (making each line (at least logically) a "do"), but
I found the following old behavior kind of annoying/confusing/
unsightly:

user=> 1 2 3
1
user=> 2
user=> 3
user=>

Regarding skip-if-eol:

The call to skip-if-eol is to support (read-line) (and other input
stream reads) from the repl. In many cases, command interpreters
(like unix shells) consume the eol that terminates a line so that
other code can read from the input stream "cleanly". If I don't do
skip-if-eol, the response from (read-line), for example, will always
be blank (when typed on a line by itself) because the eol will still
be on the input stream.

I'll look at working these operations into a repl-read function so
they can be overridden/elided. It looks now like that that function
will probably need an end-of-stream argument and an end-of-line
argument passed in as sentinel values to return on those occasions.
(see clojure.main/eof).

Thanks for the feedback. I'll look at this tonight or over the
weekend. If you have any further ideas or suggestions, I'll be happy
to hear them and to answer any questions.


Issue + patch welcome.

Issue + patch available:

http://code.google.com/p/clojure/issues/detail?id=72

Thanks,

--Steve

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to