
The game itself works well, restarting easily with no bugs that I encountered if you die, so I have no suggestions there.
As for the code, I suggest (but this is really a matter of preference after all) that you move your static resources into a "resources" directory.
It's automatically added to the classpath by Leiningen so it's become a fairly standard way of organizing static resources used by a Clojure project. Example layouts are abound; here's one of my projects for example: https://github.com/aamedina/processing.cljs
Aside from that, I noticed you used docstrings for function calls but not for defs - def too can take an optional docstring at the first argument.
I think your "game!" loop was well defined, very good job!
Overall, I'd say this is a fantastic first foray into ClojureScript. You got to use a lot of different cool bits of what it has to offer - interop with the host (by using canvas), core.async for coordinating asynchronous I/O, and it does what you set out for it to do well.
Adrian
I did not know that you could do docstrings in def, I'll definitely change it. For the statics in resources/ I'll leave them there since it is a really small project, but I'll keep it in mind for future projects. One thing to note is that the mies template puts the statics in the root of the project, so people like me may feel like that's the usual thing.
I see that in your project you are using npm and grunt for the web tasks. That's very cool, and it is something I mean to experiment a bit further down the road. Is there any reason for keeping the config files (package.json and Gruntfile.js) in the resources folders instead of in the root folder?
(defn self-collide? [snake]
(not= (count snake)
(count (distinct snake))))
There is a great writeup about writing a multiplayer game with clojurescript and core.async. Really interesting architecture and pretty similar to what I got to. I may be of interest to some:
http://ragnard.github.io/2013/10/01/clojurecup-pong-async.html