timc wrote:
> I think I know how to do fileLines, but not socketLines. (Each
> received packet should contain one line as it would have been written
> to a file, I think).
Something like this?
(use 'clojure.contrib.duck-streams)
(read-lines (.getInputStream socket))
> My problem is not how to manage a server socket,
> but how to make an ISeq -- i.e. what exactly is the contract that ISeq
> defines (the source code has no comments).
You wouldn't usually implement ISeq directly in Clojure code, you'd use
the lazy-seq function. A simple example from clojure.core:
(defn repeat
"Returns a lazy (infinite!, or length n if supplied) sequence of xs."
([x] (lazy-seq (cons x (repeat x))))
([n x] (take n (repeat x))))
It's lazy because lazy-seq doesn't evaluate it's body until you ask for
it (by calling 'seq', 'first' or 'next' on it). As you access the seq a
linked list is generated. So initially there's just a LazySeq object:
<LazySeq>
Then the body of lazy-seq is evaluated creating a cons cell of the value
x and (repeat x) which evaluates to another LazySeq:
first next
+---+---+
| x | |----> <LazySeq>
+---+---+
And so on it repeats:
first next first next
+---+---+ +---+---+
| x | |----> | x | |----> <LazySeq>
+---+---+ +---+---+
So we could make a simple function that returns a sequence of lines by
calling .readLine over and over on an object:
(defn readline-seq [rdr]
(lazy-seq (cons (.readLine rdr) (readline-seq rdr))))
However, we also want to stop at the end of the file, so we put in a
check for the line being null:
(defn readline-seq [rdr]
(lazy-seq
(when-let [line (.readLine rdr)]
(cons line (readline-seq rdr)))))
This is exactly how core/line-seq is defined, and
duck-streams/read-lines is the same except it also takes care of
adapting whatever you pass in (like a File or InputStream) to a
BufferedReader (which provides the readLine method).
As for ISeq, take a look at Range.java for a simplish example. You just
need to implement the two methods, first() which returns the first thing
in the seq and next() which returns a new seq (ie another instance of
your class) representing the next part of the seq (so seq.next().first()
is the second item, seq.next().next().first() is the third item and so on).
Hope that explanation was clear enough.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---