I took a stab at it and came up with this:

(defn make-reader [s]
  (java.io.PushbackReader. (java.io.CharArrayReader.
                            (into-array Character/TYPE (seq s)))))

(defn read-with-number
  "like read but takes in a string and returns a function
   of no arguments which will read the string and provide char number
   as in Common Lisp"
  [string]
  (let [*current-char-number* (atom 0)
        numbering-pushback-reader
        (proxy  [java.io.PushbackReader]
            [(make-reader string)]
          (read [] (swap! *current-char-number* inc) (proxy-super read
))
          (unread [stuff] (swap! *current-char-number* dec)
(proxy-super unread stuff))
          )]

    (fn [] [(read numbering-pushback-reader) (deref *current-char-number*)])))


Now you can do:

mobius.physics> (def read-oh-yeah! (read-with-number "(vector 1 2 3)
(list 5 6)"))
#'mobius.physics/read-oh-yeah!
mobius.physics> (read-oh-yeah!)
[(vector 1 2 3) 14]
mobius.physics> (read-oh-yeah!)
[(list 5 6) 25]


is that what you're going for?  please tell me how I can improve this!

--Robert McIntyre

On Sat, Aug 28, 2010 at 1:26 AM, evins.mi...@gmail.com
<evins.mi...@gmail.com> wrote:
> I'm working on a project in which it would be very useful to be able
> to easily determine how many characters were consumed in the course of
> a read operation, in a similar fashion to the way that Common Lisp's
> read-from-string returns as a second value the index of the next
> character of the input past the end of the object that was read. I
> want to, for example, read Clojure values from a buffer and keep track
> of where in the buffer they were read from.
>
> Anyone have any good ideas of how to accomplish this without some
> level of reimplementation of 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 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