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/compileHi Eric,I've been using the repl in clojure,main (which is great, BTW) but IThanks!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 ismucked with in the loop with the skip-whitepace and skip-if-eol whichmeans if I do not want that stuff to happen, I am out of luck. Canyou 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 functioninstead 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 Icontrol 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
smime.p7s
Description: S/MIME cryptographic signature