Using your example--very helpful, BTW--I simplified it a bit more:

user=> (def x 10)
#'user/x
user=> (def y #'x)
#'user/y
user=> y
#'user/x
user=> @y
10
user=> (def x (fn [me] (println "Welcome" me)))
#'user/x
user=> (y "hello")
Welcome hello
nil
user=> (@y "yikes")
Welcome yikes
nil

What I come away with from this is a better understanding that when I
refer to "y" in the above code, it's going to return a symbol.  When I
place this value in the first slot of a list, the symbol will act in
its role as a function.  Otherwise, if "y" is holding a reference to a
symbol that is a value, like 10, then I need to dereference it to use
it.

user=> (def x 15)
#'user/x
user=> @y
15
user=> (y)
java.lang.ClassCastException: java.lang.Integer cannot be cast to
clojure.lang.IFn (NO_SOURCE_FILE:0)

I believe that ClassCastException makes more sense to me now.  Like
you said, pointers.  I suppose my brain just doesn't want to accept
pointers in the JVM!

On Feb 11, 3:59 am, Alan Malloy <a...@malloys.org> wrote:
> In this case the var is simply acting as a mutable pointer, so that
> when the implementation is changed the route reflects the new value.
> Here's a simple example of that behavior in action, divorced from
> webservers and the like:
>
> ;; caller accepts a function and returns a new one that forwards to it
> repl-1=> (defn caller [f] (fn [x] (f x)))
> ;; initially we use identity
> repl-1=> (defn callee [x] x)
>
> ;; the first form passes the current value of callee; the second
> passes the "pointer"
> repl-1=> (def passed-value (caller callee))
> repl-1=> (def passed-var (caller #'callee))
>
> ;; if we redefine callee, only the pointer-version sees the new value
> repl-1=> (defn callee [x] (* 2 x))
> repl-1=> (passed-value 4)
> 4
> repl-1=> (passed-var 4)
> 8
>
> On Feb 11, 2:11 am, Sean Bowman <pico...@gmail.com> wrote:
>
>
>
>
>
>
>
> > I've been working with Compojure and Ring lately to build an app
> > server, and I've gotten my brain stuck trying to figure out wrap-
> > reload.  It seems like I have to turn my routes into vars to get wrap-
> > reload to work, but I don't understand why, and I suppose I don't
> > really understand the "when" or "where" of the situation either.
>
> > For example, if I have a bunch of resource namespaces with
> > (defroutes ...) calls in them, and a main "core" namespace that
> > aggregates them all, wrap-reload will work in a scenario like this:
>
> > (defroutes combined
> >   #'myapp.resource.users
> >   #'myapp.resource.products
> >   #'myapp.resource.other
> >   (route/resources "/")
> >   (route/not-found "Page not found"))
>
> > In the above, changing code in any of the resource namespaces auto-
> > reloads them.
>
> > But if I put two defroutes in the same namespace and try to "var" one
> > of them, wrap-reload fails:
>
> > (defroutes defaults
> >   (route/resources "/")
> >   (route/not-found "Page not found"))
>
> > (defroutes all-routes
> >   myapp.resource.users
> >   myapp.resource.products
> >   myapp.resource.other)
>
> > (defroutes combined
> >   #'all-routes
> >   defaults)
>
> > If I pass combined to (handler/site ...) in Compojure, wrap-reload
> > doesn't work.
>
> > And, if I take the original, and remove the vars, then try to call
> > handler/site and var that route, it doesn't work either:
>
> > (defroutes combined
> >   myapp.resource.users
> >   myapp.resource.products
> >   myapp.resource.other
> >   (route/resources "/")
> >   (route/not-found "Page not found"))
>
> > (def app (handler/site #'combined))
>
> > What am I not understanding here?  I feel like this is the area I
> > struggle with most, and I'm not getting it at all.
>
> > P.S.  Please don't point me at lein-ring and have me just run that.
> > I'm trying to finally understand this, and I also need to be able to
> > access the REPL in the same classloader as the running server for
> > other reasons.

-- 
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