If you don't want the overhead introduced by an atom or (maybe, I'm
not sure) by local vars, you can just instanciate a mutable object.
The simplest being just an array of Objects with just one element.
This can be achieved without java interop by using make-array , aset,
aget ...

A laaaaasst resort trick, of course.

HTH,

-- 
Laurent

2009/7/10 J. McConnell <jdo...@gmail.com>:
>
> On Thu, Jul 9, 2009 at 7:56 PM, Conrad<drc...@gmail.com> wrote:
>>
>> I'm trying to optimize an inner loop and need a variable that mutates
>> to make this work. It does NOT need to be a thread-safe variable.
>> What's the best way to create a "plain ol' mutating variable" in
>> Clojure? I know I can always use an Atom, but I was wondering if
>> there's a more low-level way (besides using the java interop, since I
>> may still want this variable to be dynamically typed.)
>
> You can try with-local-vars. I'm not sure of the performance
> characteristics of this versus using an atom, but it certainly feels
> more imperative:
>
> user=> (doc with-local-vars)
> -------------------------
> clojure.core/with-local-vars
> ([name-vals-vec & body])
> Macro
>  varbinding=> symbol init-expr
>
>  Executes the exprs in a context in which the symbols are bound to
>  vars with per-thread bindings to the init-exprs.  The symbols refer
>  to the var objects themselves, and must be accessed with var-get and
>  var-set
> nil
> user=> (with-local-vars [i 0 j 0]
>         (doseq [k (range 10)]
>           (println "i * j =" (* (var-get i) (var-get j)))
>           (var-set i (inc (var-get i)))
>           (var-set j (dec (var-get j)))))
> i * j = 0
> i * j = -1
> i * j = -4
> i * j = -9
> i * j = -16
> i * j = -25
> i * j = -36
> i * j = -49
> i * j = -64
> i * j = -81
> nil
>
> HTH,
>
> - J.
>
> >
>

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