On Aug 14, 6:37 am, Wilson MacGyver <wmacgy...@gmail.com> wrote: > I realize that. I was pondering why I don't run into the the 2nd problem. > > In your code, how many files/name spaces are you creating? > And how many lines of code are in each file? I'm curious how you > organize your code.
Sure - I'll give a quick sketch. Would love any hints if you think this is a good structure or if there is anything I should be doing differently! It's about 6,000 lines of code, 16 Clojure source files of 50-1600 lines, which typically each define their own namespace. Structure is modular, probably reflecting my preference structuring code around conceptually related subsystems. Everything gets loaded in approximately this order: protocols.clj - common protocol definition used throughout the source (e.g. defines the PGame protocol for game state) command.clj - message formatting functions for comms serial.clj - serialisation functions, wrappers for JSON save games etc. graphics.clj - graphics functions and image resource loading player.clj - utility functions for player management sounds.clj - wrapper for Java sound functions and sound resource loading map.clj - code for handling the game map and terrain units.clj - code for all the units in the game, including unit definitions and unit AI game.clj - code for managing the overall game state and updates (implements the PGame protocol) gamefactory.clj - game/landscape generator functions (depends heavily on game and map) ui.clj - common GUI functions dialogs.clj - library of common dialogs renderer.clj - library for drawing / animating the main game view interface.clj - GUI interface while playing the game, click handling etc. frame.clj - overall game window main.clj - main menu GUI and navigation The main pain points are: 1. Game state is pretty integral, but all the files above game.clj can't access it except to the extent that I expose functions in the common PGame protocol. 2. User interface comes last, which is good in general but makes it a royal pain to pass notifications back to the UI. In Java I would simply have e.g. units.clj call a simple notification function in interface.clj, in Clojure I can't do that because I can't mutually require the namespaces.... so I end up either passing a callback function or polling some atom, neither of which are particularly elegant. 3. Although it works, I don't really like declaring all the common protocols up front because it seems to violate modularity - it would seem nicer if the protocols could be bundled with their implementation in a library file and included with just one :require -- 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