Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-09 Thread dmiller




 Also, how does this work on ClojureCLR or ClojureScript? Neither of those 
 platforms has a java.io.PushbackReader, and I'm not even sure what the 
 equivalent of the clojure.java.io namespace is for them, unless the 
 java in that name is misleading.


ClojureCLR implements PushbackInputStream, PushbackTextReader and 
LineNumberingTextReader just so it can implement the Lisp reader, the EDN 
reader, and a few other things following the ClojureJVM code.

https://github.com/clojure/clojure-clr/tree/master/Clojure/Clojure/Readers


-David 

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-09 Thread Ryan Schmitt


 It turns out there are some subtle issues which can cause incorrect 
 behavior were clojure.core/read to blindly wrap a PushbackReader around its 
 argument:
 https://groups.google.com/d/msg/clojure/_tuypjr2M_A/W1EcEbMUg_cJ


 That sounds like magic. The user wrapping a PushbackReader around a 
 BufferedReader doesn't cause problems, but the library function doing so 
 does? Why would where the wrapping takes place make a difference? Is the 
 *only* problem the rare case of reading more than one object from the same 
 stream? A docstring warning to wrap manually *in those cases* would 
 suffice, then, no?


It's not a question of *where* the wrapping takes place, it's a question of 
who holds a reference to the wrapped Reader and what their expectations 
are. The reason that clojure.core/read cannot wrap its argument in a 
PushbackReader is that it doesn't know who else holds a reference to that 
argument. Let's say I have a BufferedReader that initially contains the 
following two Edn elements:

string1string2

Let's also say that I have a version of clojure.edn/read that accepts a 
BufferedReader and (unsoundly) wraps it in a PushbackReader. After the 
first read call, the PushbackReader clojure.core/read created will contain 
the following:

string2

But the BufferedReader might only contain the following:

string2

Since the PushbackReader created by clojure.core/read will be garbage 
collected after the function returns, it will be impossible to parse any 
more data correctly out of this reader. And this won't even break all of 
the time--it will only *occasionally* break, in the cases where a 
non-whitespace element gets pushed back into the PushbackReader and then 
garbage collected.

As for the motivation behind using a PushbackReader at all: 
http://en.wikipedia.org/wiki/Parsing#Lookahead

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-09 Thread Ryan Schmitt
Can anyone come up with an example of a case where the call to 
clojure.edn/read leaves an unread character in the PushbackReader? Looking 
briefly at the EdnReader source, I only see cases where the pushback buffer 
is used internally, in order to save a character that is later consumed 
during the same call to read. If this is true, and if this behavior could 
be guaranteed for all time and for all possible versions of Edn, then it 
would in fact be possible--although not necessarily worth it--for 
clojure.edn/read to accept a BufferedReader, or even an arbitrary Reader, 
as input.

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-09 Thread Fluid Dynamics


On Tuesday, December 9, 2014 11:42:40 PM UTC-5, Ryan Schmitt wrote:

 It turns out there are some subtle issues which can cause incorrect 
 behavior were clojure.core/read to blindly wrap a PushbackReader around its 
 argument:
 https://groups.google.com/d/msg/clojure/_tuypjr2M_A/W1EcEbMUg_cJ


 That sounds like magic. The user wrapping a PushbackReader around a 
 BufferedReader doesn't cause problems, but the library function doing so 
 does? Why would where the wrapping takes place make a difference? Is the 
 *only* problem the rare case of reading more than one object from the same 
 stream? A docstring warning to wrap manually *in those cases* would 
 suffice, then, no?


 It's not a question of *where* the wrapping takes place, it's a question 
 of who holds a reference to the wrapped Reader and what their expectations 
 are. The reason that clojure.core/read cannot wrap its argument in a 
 PushbackReader is that it doesn't know who else holds a reference to that 
 argument. Let's say I have a BufferedReader that initially contains the 
 following two Edn elements:

 string1string2

 Let's also say that I have a version of clojure.edn/read that accepts a 
 BufferedReader and (unsoundly) wraps it in a PushbackReader. After the 
 first read call, the PushbackReader clojure.core/read created will contain 
 the following:

 string2

 But the BufferedReader might only contain the following:

 string2

 Since the PushbackReader created by clojure.core/read will be garbage 
 collected after the function returns, it will be impossible to parse any 
 more data correctly out of this reader. And this won't even break all of 
 the time--it will only *occasionally* break, in the cases where a 
 non-whitespace element gets pushed back into the PushbackReader and then 
 garbage collected.

 As for the motivation behind using a PushbackReader at all: 
 http://en.wikipedia.org/wiki/Parsing#Lookahead


If that's the only issue, then there's not really a problem as long as read 
accepts a PushbackReader and doesn't further wrap one if it is given one. 
Then the user in an instance like the above can do their own wrapping *when 
they must*, but can also eschew it when it won't be a problem because they 
intend to discard the whole stream after the one call to read.
 

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-08 Thread Fluid Dynamics
On Monday, December 8, 2014 2:26:42 AM UTC-5, Andy Fingerhut wrote:

 In regards to your question Why isn't this documented anywhere?, it is 
 documented somewhere -- in the documentation string for clojure.edn/read, 
 the very function you were attempting to use:

 user= (doc clojure.edn/read)
 -
 clojure.edn/read
 ([] [stream] [opts stream])
   Reads the next object from stream, which must be an instance of
   java.io.PushbackReader or some derivee.  stream defaults to the
   current value of *in*.


What's *not* documented is that io/reader doesn't output something that 
edn/read can use directly, nor is there documented an officially 
recommended workaround for this.

AFAICT just wrapping the reader output in (java.io.PushbackReader. ...) 
works.

Still, this is awkward, verbose, and prevents the (nontrivial) use of edn 
in a platform-neutral way by referring only to Clojure functions without 
direct interop. Well, except for the even more awkward workaround of slurp 
and read-string, with the accompanying need to hold the entire file in 
memory *twice* for a short time.

As far as why it requires a PushbackReader, I didn't design the API.  Yes, 
 some things in Clojure require using Java interop, and in many (but not 
 all) cases, file I/O requires it.


Perhaps io/reader should output a PushbackReader, if only for convenience's 
sake.

Also, how does this work on ClojureCLR or ClojureScript? Neither of those 
platforms has a java.io.PushbackReader, and I'm not even sure what the 
equivalent of the clojure.java.io namespace is for them, unless the java 
in that name is misleading.

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-08 Thread Ashton Kemerling
Nothing in the Java.io namespace was made by the clojure team, so it's not 
their fault that reader and pushbackreader aren't cross compatible. I'm 
assuming that they need something from pushbackreader for performance reasons, 
but that's just a guess. 

Clojurescript and ClojureCLR must have different solutions because they're just 
different platforms. Abstracting the whole high performance IO api from each of 
these platforms is silly and probably unwise.  

--Ashton

Sent from my iPhone

 On Dec 8, 2014, at 1:12 AM, Fluid Dynamics a2093...@trbvm.com wrote:
 
 On Monday, December 8, 2014 2:26:42 AM UTC-5, Andy Fingerhut wrote:
 In regards to your question Why isn't this documented anywhere?, it is 
 documented somewhere -- in the documentation string for clojure.edn/read, 
 the very function you were attempting to use:
 
 user= (doc clojure.edn/read)
 -
 clojure.edn/read
 ([] [stream] [opts stream])
   Reads the next object from stream, which must be an instance of
   java.io.PushbackReader or some derivee.  stream defaults to the
   current value of *in*.
 
 What's *not* documented is that io/reader doesn't output something that 
 edn/read can use directly, nor is there documented an officially recommended 
 workaround for this.
 
 AFAICT just wrapping the reader output in (java.io.PushbackReader. ...) 
 works.
 
 Still, this is awkward, verbose, and prevents the (nontrivial) use of edn in 
 a platform-neutral way by referring only to Clojure functions without direct 
 interop. Well, except for the even more awkward workaround of slurp and 
 read-string, with the accompanying need to hold the entire file in memory 
 *twice* for a short time.
 
 As far as why it requires a PushbackReader, I didn't design the API.  Yes, 
 some things in Clojure require using Java interop, and in many (but not all) 
 cases, file I/O requires it.
 
 Perhaps io/reader should output a PushbackReader, if only for convenience's 
 sake.
 
 Also, how does this work on ClojureCLR or ClojureScript? Neither of those 
 platforms has a java.io.PushbackReader, and I'm not even sure what the 
 equivalent of the clojure.java.io namespace is for them, unless the java in 
 that name is misleading.
 
 -- 
 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
 --- 
 You received this message because you are subscribed to the Google Groups 
 Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send an 
 email to clojure+unsubscr...@googlegroups.com.
 For more options, visit https://groups.google.com/d/optout.

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-08 Thread László Török
2014-12-08 8:12 GMT+00:00 Fluid Dynamics a2093...@trbvm.com:

 On Monday, December 8, 2014 2:26:42 AM UTC-5, Andy Fingerhut wrote:

 In regards to your question Why isn't this documented anywhere?, it is
 documented somewhere -- in the documentation string for clojure.edn/read,
 the very function you were attempting to use:

 user= (doc clojure.edn/read)
 -
 clojure.edn/read
 ([] [stream] [opts stream])
   Reads the next object from stream, which must be an instance of
   java.io.PushbackReader or some derivee.  stream defaults to the
   current value of *in*.


 What's *not* documented is that io/reader doesn't output something that
 edn/read can use directly, nor is there documented an officially
 recommended workaround for this.


FWIW I don't think that io/reader(v1.2) was intended to output something
that edn/read can use directly, as it was added well before clojure.edn
(v1.5).


 AFAICT just wrapping the reader output in (java.io.PushbackReader. ...)
 works.

There you go.



 Still, this is awkward, verbose, and prevents the (nontrivial) use of edn
 in a platform-neutral way by referring only to Clojure functions without
 direct interop. Well, except for the even more awkward workaround of slurp
 and read-string, with the accompanying need to hold the entire file in
 memory *twice* for a short time.


 As far as why it requires a PushbackReader, I didn't design the API.  Yes,
 some things in Clojure require using Java interop, and in many (but not
 all) cases, file I/O requires it.


 Perhaps io/reader should output a PushbackReader, if only for
 convenience's sake.

io/reader is not meant to be used solely as an input to edn/read.



 Also, how does this work on ClojureCLR or ClojureScript? Neither of those
 platforms has a java.io.PushbackReader, and I'm not even sure what the
 equivalent of the clojure.java.io namespace is for them, unless the
 java in that name is misleading.

Exactly! There is no clojure.java.io as they are on a different host.
Different host implies likely different I/O capabilities.
BTW cljs has cljs.reader/read-string


  --
 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
 ---
 You received this message because you are subscribed to the Google Groups
 Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send an
 email to clojure+unsubscr...@googlegroups.com.
 For more options, visit https://groups.google.com/d/optout.




-- 
László Török

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-08 Thread Fluid Dynamics
On Monday, December 8, 2014 9:32:28 AM UTC-5, Las wrote:

 Still, this is awkward, verbose, and prevents the (nontrivial) use of edn 
 in a platform-neutral way by referring only to Clojure functions without 
 direct interop. Well, except for the even more awkward workaround of slurp 
 and read-string, with the accompanying need to hold the entire file in 
 memory *twice* for a short time. 


 As far as why it requires a PushbackReader, I didn't design the API.  
 Yes, some things in Clojure require using Java interop, and in many (but 
 not all) cases, file I/O requires it.


 Perhaps io/reader should output a PushbackReader, if only for 
 convenience's sake.

 io/reader is not meant to be used solely as an input to edn/read.


AFAICT, PushbackReader is substitutable anywhere a reader is expected, but 
apparently a plain unwrapped BufferedReader is not. 

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-08 Thread Michał Marczyk
On 8 December 2014 at 21:17, Fluid Dynamics a2093...@trbvm.com wrote:
 On Monday, December 8, 2014 9:32:28 AM UTC-5, Las wrote:
 […]
 io/reader is not meant to be used solely as an input to edn/read.


 AFAICT, PushbackReader is substitutable anywhere a reader is expected, but
 apparently a plain unwrapped BufferedReader is not.

user= (line-seq (java.io.PushbackReader. (io/reader (io/file .bashrc
ClassCastException java.io.PushbackReader cannot be cast to
java.io.BufferedReader  clojure.core/line-seq (core.clj:2955)

It works with the plain unwrapped BufferedReader that io/reader returns.

Unfortunately PushbackReader and BufferedReader are both classes
rather than interfaces and they both have methods that the other class
does not. So, there isn't a single good choice for what a reader
function in Clojure on the JVM should return.

Cheers,
Michał



 --
 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
 ---
 You received this message because you are subscribed to the Google Groups
 Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send an
 email to clojure+unsubscr...@googlegroups.com.
 For more options, visit https://groups.google.com/d/optout.

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-08 Thread Fluid Dynamics
On Monday, December 8, 2014 4:01:28 PM UTC-5, Michał Marczyk wrote:

 On 8 December 2014 at 21:17, Fluid Dynamics a209...@trbvm.com 
 javascript: wrote: 
  On Monday, December 8, 2014 9:32:28 AM UTC-5, Las wrote: 
  […] 
  io/reader is not meant to be used solely as an input to edn/read. 
  
  
  AFAICT, PushbackReader is substitutable anywhere a reader is expected, 
 but 
  apparently a plain unwrapped BufferedReader is not. 

 user= (line-seq (java.io.PushbackReader. (io/reader (io/file 
 .bashrc 
 ClassCastException java.io.PushbackReader cannot be cast to 
 java.io.BufferedReader  clojure.core/line-seq (core.clj:2955) 

 It works with the plain unwrapped BufferedReader that io/reader returns. 

 Unfortunately PushbackReader and BufferedReader are both classes 
 rather than interfaces and they both have methods that the other class 
 does not. So, there isn't a single good choice for what a reader 
 function in Clojure on the JVM should return. 

 
Jeez. Who made this mess? And what happens on other VM targets? What does 
line-seq expect in CLJS or CLR?

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-08 Thread Andy Fingerhut
To Fluid Dynamics:

I attempted to send this privately to the email address a2093...@trbvm.com,
but got a permanent failure to deliver.  Hence the open letter.

I understand that some things do not work as you wish them to, and I
understand that one can be frustrated or shocked by the state of libraries
that you find confusing or broken, but there are other ways to express this
that can be less inflammatory.

For example, instead of Jeez. Who made this mess? one might say That's
an unfortunate state of affairs.  Do you know how it got this way, or
whether there are existing Clojure libraries that smooth some of this over
for the developer?

Thanks,
Andy Fingerhut

On Mon, Dec 8, 2014 at 1:13 PM, Fluid Dynamics a2093...@trbvm.com wrote:

 On Monday, December 8, 2014 4:01:28 PM UTC-5, Michał Marczyk wrote:

 On 8 December 2014 at 21:17, Fluid Dynamics a209...@trbvm.com wrote:
  On Monday, December 8, 2014 9:32:28 AM UTC-5, Las wrote:
  […]
  io/reader is not meant to be used solely as an input to edn/read.
 
 
  AFAICT, PushbackReader is substitutable anywhere a reader is expected,
 but
  apparently a plain unwrapped BufferedReader is not.

 user= (line-seq (java.io.PushbackReader. (io/reader (io/file
 .bashrc
 ClassCastException java.io.PushbackReader cannot be cast to
 java.io.BufferedReader  clojure.core/line-seq (core.clj:2955)

 It works with the plain unwrapped BufferedReader that io/reader returns.

 Unfortunately PushbackReader and BufferedReader are both classes
 rather than interfaces and they both have methods that the other class
 does not. So, there isn't a single good choice for what a reader
 function in Clojure on the JVM should return.


 Jeez. Who made this mess? And what happens on other VM targets? What does
 line-seq expect in CLJS or CLR?

 --
 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
 ---
 You received this message because you are subscribed to the Google Groups
 Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send an
 email to clojure+unsubscr...@googlegroups.com.
 For more options, visit https://groups.google.com/d/optout.


-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-08 Thread Stuart Sierra
As the original author of the function that eventually became 
clojure.java.io/reader, it was one of those unfortunate decisions that 
seemed like a good idea at the time and cannot be changed without breaking 
backwards compatibility.

Long before EDN existed, I wrote clojure.contrib.io 
https://github.com/clojure/clojure-contrib/blob/1.2.x/src/main/clojure/clojure/contrib/io.clj

This included a function `reader` that returned a java.io.BufferedReader: 
http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html

BufferedReader was a convenient type to return because it supports 
.readLine, which is used by clojure.core/line-seq: 
https://github.com/clojure/clojure/blob/1.1.x/src/clj/clojure/core.clj#L1954-L1960

However, clojure.core/read and later clojure.edn/read were written in terms 
of java.io.PushbackReader, because they need the ability to look ahead one 
character in the stream while parsing it:
http://docs.oracle.com/javase/7/docs/api/java/io/PushbackReader.html

java.io.PushbackReader and java.io.BufferedReader are both subclasses of 
java.io.Reader, but there is no class in the JDK which combines the 
features of both PushbackReader and BufferedReader. Java does not permit 
multiple inheritance of concrete classes.

In Java it is common to have several layers of Reader sub-classes wrapped 
around each other, so that's what we do.

We cannot change clojure.java.io/reader to return a different type without 
breaking a lot of existing code that expects it to return a BufferedReader.

This was reported as an issue in 2009 and discussed on the mailing list:
https://groups.google.com/forum/#!topic/clojure/_tuypjr2M_A
http://dev.clojure.org/jira/browse/CLJ-82

It turns out there are some subtle issues which can cause incorrect 
behavior were clojure.core/read to blindly wrap a PushbackReader around its 
argument:
https://groups.google.com/d/msg/clojure/_tuypjr2M_A/W1EcEbMUg_cJ

In conclusion, this is a minor nuisance, well-known to Clojure developers, 
for which no good solution has been identified.

–S


On Sunday, December 7, 2014 11:27:05 PM UTC-5, Fluid Dynamics wrote:

 = (with-open [in (io/reader (io/resource foo))] (edn/read in))
 ClassCastException java.io.BufferedReader cannot be cast to 
 java.io.PushbackReader  clojure.edn/read (edn.clj:35)

 Er, what? Aren't these things supposed to just plug into each other and 
 work OOTB? Do I need to muck about with interop to use edn with any input 
 source other than strings, then?


-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-08 Thread Fluid Dynamics
On Monday, December 8, 2014 7:32:29 PM UTC-5, Stuart Sierra wrote:

 As the original author of the function that eventually became 
 clojure.java.io/reader, it was one of those unfortunate decisions that 
 seemed like a good idea at the time and cannot be changed without breaking 
 backwards compatibility.

 Long before EDN existed, I wrote clojure.contrib.io 
 https://github.com/clojure/clojure-contrib/blob/1.2.x/src/main/clojure/clojure/contrib/io.clj

 This included a function `reader` that returned a java.io.BufferedReader: 
 http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html

 BufferedReader was a convenient type to return because it supports 
 .readLine, which is used by clojure.core/line-seq: 
 https://github.com/clojure/clojure/blob/1.1.x/src/clj/clojure/core.clj#L1954-L1960

 However, clojure.core/read and later clojure.edn/read were written in 
 terms of java.io.PushbackReader, because they need the ability to look 
 ahead one character in the stream while parsing it:
 http://docs.oracle.com/javase/7/docs/api/java/io/PushbackReader.html


Seems like the simplest fix at the library level would be to make core/read 
and edn/read accept both classes and wrap BufferedReaders in 
PushbackReaders themselves, then.
 

 It turns out there are some subtle issues which can cause incorrect 
 behavior were clojure.core/read to blindly wrap a PushbackReader around its 
 argument:
 https://groups.google.com/d/msg/clojure/_tuypjr2M_A/W1EcEbMUg_cJ


That sounds like magic. The user wrapping a PushbackReader around a 
BufferedReader doesn't cause problems, but the library function doing so 
does? Why would where the wrapping takes place make a difference? Is the 
*only* problem the rare case of reading more than one object from the same 
stream? A docstring warning to wrap manually *in those cases* would 
suffice, then, no?

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-08 Thread Matching Socks
How many programmers does it take to change a light bulb?!

http://dev.clojure.org/jira/browse/CLJ-1611

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-08 Thread Luc Préfontaine
Dunno the answer but I know how many buddhist monks are needed, exactly three:

a) the first one readies itself for the bulb swap! by repeating a mantra
b) the second meditates to make the first monk levitate toward the fixture 
c) the third one immolates itself to provide light for the entire duration of 
the operation

Sorry for all the buddhist monks that may be offended by the above :)
I like black humor very much and this is probably the only joke that I can write
on this list that will not qualify me hopefully for eternal damnation... Euh 
moderation...

Luc P.

Sent from my iPad

 On Dec 8, 2014, at 20:11, Matching Socks phill.w...@gmail.com wrote:
 
 How many programmers does it take to change a light bulb?!
 
 http://dev.clojure.org/jira/browse/CLJ-1611
 
 -- 
 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
 --- 
 You received this message because you are subscribed to the Google Groups 
 Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send an 
 email to clojure+unsubscr...@googlegroups.com.
 For more options, visit https://groups.google.com/d/optout.

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-08 Thread Dylan Butman
+10 for bringing this thread around. 

On Monday, December 8, 2014 9:42:33 PM UTC-5, Luc wrote:

 Dunno the answer but I know how many buddhist monks are needed, exactly 
 three:

 a) the first one readies itself for the bulb swap! by repeating a mantra
 b) the second meditates to make the first monk levitate toward the fixture 
 c) the third one immolates itself to provide light for the entire duration 
 of the operation

 Sorry for all the buddhist monks that may be offended by the above :)
 I like black humor very much and this is probably the only joke that I can 
 write
 on this list that will not qualify me hopefully for eternal damnation... 
 Euh moderation...

 Luc P.

 Sent from my iPad

 On Dec 8, 2014, at 20:11, Matching Socks phill...@gmail.com javascript: 
 wrote:

 How many programmers does it take to change a light bulb?!

 http://dev.clojure.org/jira/browse/CLJ-1611

  -- 
 You received this message because you are subscribed to the Google
 Groups Clojure group.
 To post to this group, send email to clo...@googlegroups.com javascript:
 Note that posts from new members are moderated - please be patient with 
 your first post.
 To unsubscribe from this group, send email to
 clojure+u...@googlegroups.com javascript:
 For more options, visit this group at
 http://groups.google.com/group/clojure?hl=en
 --- 
 You received this message because you are subscribed to the Google Groups 
 Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send an 
 email to clojure+u...@googlegroups.com javascript:.
 For more options, visit https://groups.google.com/d/optout.



-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-07 Thread Fluid Dynamics
= (with-open [in (io/reader (io/resource foo))] (edn/read in))
ClassCastException java.io.BufferedReader cannot be cast to 
java.io.PushbackReader  clojure.edn/read (edn.clj:35)

Er, what? Aren't these things supposed to just plug into each other and 
work OOTB? Do I need to muck about with interop to use edn with any input 
source other than strings, then?

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: clojure.edn won't accept clojure.java.io/reader? How to work around this and why isn't this documented anywhere?

2014-12-07 Thread Andy Fingerhut
In regards to your question Why isn't this documented anywhere?, it is
documented somewhere -- in the documentation string for clojure.edn/read,
the very function you were attempting to use:

user= (doc clojure.edn/read)
-
clojure.edn/read
([] [stream] [opts stream])
  Reads the next object from stream, which must be an instance of
  java.io.PushbackReader or some derivee.  stream defaults to the
  current value of *in*.

etc.


As far as why it requires a PushbackReader, I didn't design the API.  Yes,
some things in Clojure require using Java interop, and in many (but not
all) cases, file I/O requires it.

Andy

On Sun, Dec 7, 2014 at 8:27 PM, Fluid Dynamics a2093...@trbvm.com wrote:

 = (with-open [in (io/reader (io/resource foo))] (edn/read in))
 ClassCastException java.io.BufferedReader cannot be cast to
 java.io.PushbackReader  clojure.edn/read (edn.clj:35)

 Er, what? Aren't these things supposed to just plug into each other and
 work OOTB? Do I need to muck about with interop to use edn with any input
 source other than strings, then?

 --
 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
 ---
 You received this message because you are subscribed to the Google Groups
 Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send an
 email to clojure+unsubscr...@googlegroups.com.
 For more options, visit https://groups.google.com/d/optout.


-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.