I liked approach 2 myself, if the goal is to stick with pure functions when it 
isn't too difficult.  It avoids the comparison of 1, and gets you back exactly 
the info you want to go onwards from there.

You can add a caveat that I haven't written a lot of application code with 
Clojure, so weight this advice however you like.

Andy

On Mar 19, 2012, at 3:56 AM, Narvius wrote:

> I am writing a game in Clojure, and I often need some functions to return 
> whether they succeeded in doing what they are supposed to do (for example, 
> moving that unit one field to the left may fail due to... I don't know, a 
> wall?).
> 
> But if there is one thing I really like about LISPs is the idea of pure 
> functions. So, most of those state-manipulating functions like moving really 
> just return a new world state. Which may or may not be the same as the 
> previous one, depending on the circumstances.
> 
> I see several ways to achieve what I want, that is to return both the new 
> world state and success status.
> 1) Compare the old and new value - doesn't seem very efficient.
> 2) Return [new-state success?] instead of just new-state - requires too much 
> acrobatics from the user of the function (which is still me, but whatever).
> 3) def some atom that will be set accordingly - I thought this was a step in 
> the right direction, but... global mutable state? Yuck.
> 4) Allow an optional last argument to world-modifying functions which is an 
> atom that gets set to the success value. This is what I ultimately settled 
> for, and I think it is somewhat elegant. That way I minimize the side effects 
> to a level I can fully control.
> I currently have a function called safe-reset! which is basically (and a 
> (reset! a v)), so I don't have to type it out every time myself, and all 
> functions that have that optional last argument simply call themselves with 
> an additional nil.
> 
> Now, my question is - is there some neater scheme for doing this? And if not, 
> then at least I hope my idea is helpful to someone. :)

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