[Question] How to properly start up refs in web applications?

88 views
Skip to first unread message

Thais Lima

unread,
Nov 17, 2018, 5:03:00 PM11/17/18
to Clojure
Hi, 

I've started learning Clojure and I am creating a simple web application using Compojure and Ring.
I have refs defined in my core.clj like this:

(def my-ref1 (ref {}))
(def my-ref2 (ref {}))
(def my-ref3 (ref 0))


And in my handler.clj, I call the functions from my core namespace that change those refs inside a dosync.

The problem is: I've created tests for my handler and for my core, when I ran each of them separately, everything works fine. 
But when I ran 

lein test

I get errors for my handler-test, because my refs were modified by the core-test and this messes up my expected results.

Besides that problem, I wonder if there is a proper way of defining those refs in ring initialization. 

What is the proper way of initializing refs in a project?

Thank you,
Thais

Sean Corfield

unread,
Nov 17, 2018, 7:32:55 PM11/17/18
to clo...@googlegroups.com

This doesn’t answer your question but I’m wondering why you’re using refs at all? In production Clojure code I think they are extremely rare (we have about 85K lines of Clojure and no refs at all).

 

Sean Corfield -- (970) FOR-SEAN -- (904) 302-SEAN
An Architect's View -- http://corfield.org/

"If you're not annoying somebody, you're not really alive."
-- Margaret Atwood

 


From: clo...@googlegroups.com <clo...@googlegroups.com> on behalf of Thais Lima <thaisl...@gmail.com>
Sent: Saturday, November 17, 2018 1:27:25 PM
To: Clojure
Subject: [Question] How to properly start up refs in web applications?
 
--
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
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
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.
For more options, visit https://groups.google.com/d/optout.

Oliver Muellerklein

unread,
Nov 17, 2018, 7:36:43 PM11/17/18
to clo...@googlegroups.com
Hello,

I also recently started learning Clojure and got throw into developing a web app using Ring and Clojurescript. Can we be something like pen pal but for Clojure dev? I have someone guiding me through a lot of the Clojure but it would be so helpful I think to both of us if we could bounce ideas and get help etc. 

Do you use Cider? It's great. You can great a Clojure REPL as you develop. I'm not sure what the answer to your problem is. But I think Leinegein is always looking for a deps.edn file right? 

-Oliver 

--

Oliver Muellerklein

unread,
Nov 17, 2018, 7:40:58 PM11/17/18
to clo...@googlegroups.com
I am working with Gary Johnson. Here is a great web app dev skeleton he created. 

Thais Lima

unread,
Nov 17, 2018, 7:53:59 PM11/17/18
to clo...@googlegroups.com
Hello Sean,

I'm using refs for an exercise in which I have to handle state changes without a database.

You received this message because you are subscribed to a topic in the Google Groups "Clojure" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/clojure/Bx0lOp3m6bo/unsubscribe.
To unsubscribe from this group and all its topics, send an email to clojure+u...@googlegroups.com.

Matching Socks

unread,
Nov 18, 2018, 9:26:27 AM11/18/18
to Clojure
The ref is a good step, but it seems that accessing it via a global variable causes a problem. 

So don't use a global variable.  Pass everything into the Ring handlers via the formal parameters.  Compojure-style Ring handlers have only one formal parameter, the request map, but you can put anything into it.  In short, someone needs to poke the ref into the request map.  In the Ring world, functions named "wrap-..." often figure in the creation of the main handler precisely to do this sort of thing.  Usually, they put something (like the ref) in closure with an anonymous Ring handler that copies it into the request map and delegates to downstream handlers.

By the way, if there is only one value to coordinate (e.g., in a typical case, one big map of all knowledge), using a ref is "the hard way" and an atom is simpler to deal with.  Same concept, less red tape.  And there can usually be just one value to coordinate!  A typical program does not use three databases, so why should it need three refs?
Reply all
Reply to author
Forward
0 new messages