Re: question on passing variable to function by reference
- To: mathgroup at smc.vnet.net
- Subject: [mg113653] Re: question on passing variable to function by reference
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Sat, 6 Nov 2010 04:59:55 -0500 (EST)
Hi Sjoerd, The code I got to illustrate the technique was a bit too large to include in a post, and besides is much easier to run from a notebook, which I could not attach here - so I sent it to you in a separate message. I am posting this message on the group just in case that one did not make it through your spam filter. Regards, Leonid On Thu, Nov 4, 2010 at 11:57 AM, Sjoerd C. de Vries < sjoerd.c.devries at gmail.com> wrote: > Hi Leonid, > > Thanks for the your extended responses. Very interesting. I would love to > learn more about your application of the technique in UI programming. > > Cheers -- Sjoerd > > Hi Sjoerd, > > FWIW, I can confirm that this is indeed pass-by-reference. I find this > quite > useful at times. > Perhaps, the most useful for me was the ability to pass symbols to > functions > which then > define those symbols inside their scope as closures (functions which > operate > on internal state of those > functions outside their scope), so that I can later use them in my original > larger function to operate > on the symbols created in a second larger function. This is very useful in > UI programming with Dynamic, for > instance - this way you can split the monolithic UI into more managable > chunks and still > maintain the dynamic updating of the variables. I will be happy to extract > some minimal > example out of my code if you are interested. > > Sometimes it also offers algorithmic advantages, if the algorithm is more > suited for > in-place modifications. In this thread > > > http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/ > thread/69d53a2ffa5a640e<http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/%0Athread/69d53a2ffa5a640e> > > I gave a pass-by-reference based implementation of qsort, which is > asymptotically better than > the alternative one using immutable lists. > > The massive simultaneous assignments using Part, which are very fast, also > use pass-by-reference to gain > the speed which is hard to achieve by other means,and are more > memory-efficient at the same time. > > I am also using pass-by-reference to dynamically generate data structures > (structs), for example > as described in my post in this recent thread: > > > http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/ > thread/b2ddf61da56b0be9<http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/%0Athread/b2ddf61da56b0be9> > > The code there is not exactly transparent, but the idea is simple: if you > have a structure field name > say foo, you can take a symbol foo and give it HoldAll attribute. Then, > expression like > > s = With[{var = Unique[]},foo[var]] > > or > > s = foo[Evaluate[Unique[]]] > > can be viewed as the "memory cell", so that you can store some information > in it. In particular, > s[[1]]=smth will assign a new value, and s[[1]] will return the currently > stored value. > > I am sure there are other uses for pass-by-reference mechanism, these are > just some off the top of > my head, in case if you are interested. > > Now, regarding the check for list being a list in the OP situation.There > will be a problem with such check > if the passed argument is stored in a variable (so that what is passed is a > variable rather than literal list), > and if the check is implemented straightforwardly as _List, due to the > interplay between pattern-matching > and evaluation. There was a question on the group on a very similar setting > about a year ago: > > > http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/ > thread/c062579f93e093a6<http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/%0Athread/c062579f93e093a6> > > and I also discussed this topic in my book at > > http://www.mathprogramming-intro.org/book/node408.html > > where I consider this situation in greater detail. > > > Cheers, > Leonid > > > > > On Tue, Nov 2, 2010 at 1:01 PM, Sjoerd C. de Vries > <sjoerd.c.devries at gmail.com> wrote: > > Actually, I thought you couldn't do a 'pass by reference' in > Mathematica, but this really looks like the real thing. > > You might want to add a test to check that list is really a List, but > otherwise I don't see a problem. > > Cheers -- Sjoerd > > On Nov 1, 11:01 am, "Nasser M. Abbasi" <n... at 12000.org> wrote: > > Suppose I want to pass an array to function to be filled in by some > value= > > > >