Re: question on passing variable to function by reference
- To: mathgroup at smc.vnet.net
- Subject: [mg113591] Re: question on passing variable to function by reference
- From: "Sjoerd C. de Vries" <sjoerd.c.devries at gmail.com>
- Date: Thu, 4 Nov 2010 03:57:45 -0500 (EST)
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 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 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 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=