A more commonly used feature are bindings, which are sort of "pluggable" (or rather overridable) dynamic vars.
http://stackoverflow.com/questions/1523240/let-vs-binding-in-clojure In short you declare a variable as dynamic and then use some binding around the function-call. Sort of a reusable let-body, but with slightly different characteristics. /Linus On Saturday, June 14, 2014, Mars0i <marsh...@logical.net> wrote: > Here's a way to do it. Not sure if this is what you want. > > (let [x (atom 12)] > (defn next-number [] (swap! x inc))) > > Functions are clojures, which means that next-number can retain a pointer > to a variable that it can see when it's defined. > > If some of the ideas here are unfamiliar: > The atom function gives you something that you can modify in place, in > effect, and swap! is one way to modify it. Passing inc to swap! applies > inc to the value in the atom x, and stores the result back into the atom. > (I'm not sure if my wording here is precisely correct, but the idea should > be clear enough.) > > You can also use a top-level variable instead of a local one defined by > let: > > (def x (atom 12)) > (defn next-number [] (swap! x inc)) > @x ;=> 12 > ; [the @ operator gets the value out of the atom.] > (next-number) ;=> 13 > @x ;=> 13 > (next-number) ;=> 14 > > With the let form, (next-number) is your *only* way of accessing x, which > could be a good thing or a bad thing--unless you define other functions in > the scope of the let at the same time that you define next-number: > > (let [x (atom 12)] > (defn next-number [] (swap! x inc)) > (defn undo-next [] (swap! x dec)) > (defn check-number [] @x)) > > (check-number) ;=> 12 > (check-number) ;=> 12 > (next-number) ;=> 13 > (check-number) ;=> 13 > (undo-next) ;=> 12 > (check-number) ;=> 12 > > > (Perhaps many Clojure programmers *would* consider all of this perverse, > but similar things are considered ... cool in the some corners of the > Scheme and Common Lisp worlds. ("cool" doesn't necessarily mean "useful > often"--just *cool*--and maybe useful now and then.)) > > On Friday, June 13, 2014 7:16:09 PM UTC-5, Christopher Howard wrote: >> >> This might be kind of perverse, but I was wondering if it was possible >> to write a function or macro that takes "hidden parameters", i.e., >> uses symbols defined in the scope of use, without passing them in >> explicitly. >> >> For example, function "next-number" takes hidden parameter "x", so >> >> => (let [x 12] (next-number)) >> >> Would return 13. >> >> With the whole "code is data" paradigm it seems like this should be >> possible, but I haven't figured out how to do this yet without getting >> an error. >> > -- > 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 > <javascript:_e(%7B%7D,'cvml','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 > <javascript:_e(%7B%7D,'cvml','clojure%2bunsubscr...@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+unsubscr...@googlegroups.com > <javascript:_e(%7B%7D,'cvml','clojure%2bunsubscr...@googlegroups.com');>. > For more options, visit https://groups.google.com/d/optout. > -- 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 --- 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+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.