The snippet:
-------------------------------------------------------
(def reschedule nil) ; Forward declaration

(defn broadcast [msg]
  (reschedule)
  (doall
    (map
      (fn [client]
        (send-msg client msg))
      @clients)))
-------------------------------------------------------

(def reschedule nil) is a forward declaration. It is just there to
avoid syntax error, because "broadcast" uses "reschedule", thus
"reschedule" must exist before "broadcast". "reschedule" is actually
defined later in the file.

Thanks for your interest.


On Oct 16, 4:06 pm, Emeka <emekami...@gmail.com> wrote:
> Ngo,
>
> I checked out your github , it is great. I have not used netty, it looks
> clean. However, what is the meaning of this, (def reshedule nil)?
>
> Regards,
> Emeka
>
> On Thu, Oct 15, 2009 at 3:02 AM, ngocdaothanh <ngocdaoth...@gmail.com>wrote:
>
>
>
> > I created this (Netty is used instead of server-socket):
> >http://github.com/ngocdaothanh/telchat-clojure
>
> > I am going to create a Scala version of the same program to have a
> > feeling of Clojure vs Scala, it will be telchat-scala.
>
> > On Oct 14, 10:12 pm, Emeka <emekami...@gmail.com> wrote:
> > > Ngo,
>
> > > Honestly  speaking I don't know. How far have you gone?
>
> > > Regards,
> > > Emeka
>
> > > On Sat, Oct 3, 2009 at 3:21 PM, ngocdaothanh <ngocdaoth...@gmail.com>
> > wrote:
>
> > > > Emeka, good catch. It's just my mistake.
>
> > > > Another thing is I think there may be exception raised when on-msg
> > > > sends message to a closed socket. How would you solve this?
>
> > > > On Oct 3, 7:35 pm, Emeka <emekami...@gmail.com> wrote:
> > > > > ngo,
> > > > > I was about doing this kind of client/server thing some  days ago,
> > > > however
> > > > > now you are into it I would like to learn then. I am not quite clear
> > why
> > > > you
> > > > > have this:
> > > > > (.start (new Thread (fn [] (create-server 8080 chat-loop))))
>
> > > > > My concern is on  Thread, create-server function has a Thread inside
> > > > > create-server-aux function.
>
> > > > > Regards,
> > > > > Emeka
>
> > > > > On Fri, Oct 2, 2009 at 3:13 AM, ngocdaothanh <ngocdaoth...@gmail.com
>
> > > > wrote:
>
> > > > > > > I'm not sure TCP/IP has a native facility for that.
>
> > > > > > I'm afraid John's statement is correct:
>
> >http://www.velocityreviews.com/forums/t125620-client-socket-disconnec.
> > > > ..
> > > > > > and trying to read and write until something wrong happens as
> > > > > > demonstrated in Roger's code is the only way to check for
> > > > > > disconnection.
>
> > > > > > Below is my new code. Sorry it is rather long.
>
> > > > > > (import '[java.io BufferedReader InputStreamReader
> > > > > > OutputStreamWriter])
> > > > > > (use 'clojure.contrib.server-socket)
>
> > > > > > (def clients (ref []))  ; Each client is an *out*
>
> > > > > > (defn on-msg [from msg]
> > > > > >  (println msg)
> > > > > >  (doall
> > > > > >    (map
> > > > > >      (fn [client]
> > > > > >        (if-not (= from client)
> > > > > >          (binding [*out* client]
> > > > > >            (println msg)
> > > > > >            (flush))))
> > > > > >     �...@clients)))
>
> > > > > > (defn on-disconnect [client]
> > > > > >  (dosync
> > > > > >    (alter clients
> > > > > >      (fn [clients]
> > > > > >        (remove (fn [c] (= c client)) clients))))
> > > > > >  (on-msg client "A client has disconnected"))
>
> > > > > > (defn on-connect [client]
> > > > > >  (dosync (alter clients conj client))
> > > > > >  (on-msg client "A client has connected"))
>
> > > > > > (defn chat-loop [is os]
> > > > > >  (let [client (OutputStreamWriter. os)]
> > > > > >    (on-connect client)
> > > > > >    (binding [*in* (BufferedReader. (InputStreamReader. is))]
> > > > > >      (loop []
> > > > > >        (let [msg (read-line)]  ; msg is nil when the client
> > > > > > disconnects
> > > > > >          (if (nil? msg)
> > > > > >            (on-disconnect client)
> > > > > >            (do
> > > > > >              (on-msg client msg)
> > > > > >              (recur))))))))
>
> > > > > > (.start (new Thread (fn [] (create-server 8080 chat-loop))))
>
> > > > > > On Oct 2, 5:20 am, John Harrop <jharrop...@gmail.com> wrote:
> > > > > > > On Thu, Oct 1, 2009 at 4:02 PM, Roger Gilliar <ro...@gilliar.de>
> > > > wrote:
> > > > > > > > Am 01.10.2009 um 21:28 schrieb ngocdaothanh:
> > > > > > > > > Roger, your code is not event based.
> > > > > > > > What do you mean by not event based ?
>
> > > > > > > He means he wants automatic notification if a connection is
> > dropped.
>
> > > > > > > I'm not sure TCP/IP has a native facility for that.
>
> > > > > > > What most chat type programs, multiplayer games, and suchlike do
> > is
> > > > send
> > > > > > a
> > > > > > > periodic ping from server to each connected client, which as part
> > of
> > > > the
> > > > > > > chat protocol the client is supposed to acknowledge. If a client
> > > > stops
> > > > > > > responding for more than a few ping-intervals, it's assumed to
> > have
> > > > > > > disconnected or otherwise become unreachable.
>
> > > > > > > This method has the advantage of being entirely under the control
> > of
> > > > the
> > > > > > > application layer, and the further advantage of also working with
> > UDP
> > > > > > (which
> > > > > > > is crucial in the "multiplayer games" case at least).
--~--~---------~--~----~------------~-------~--~----~
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