Re: "dereference" variable
- To: mathgroup at smc.vnet.net
- Subject: [mg82074] Re: [mg82033] "dereference" variable
- From: DrMajorBob <drmajorbob at bigfoot.com>
- Date: Thu, 11 Oct 2007 00:22:00 -0400 (EDT)
- References: <22397821.1192019277612.JavaMail.root@m35>
- Reply-to: drmajorbob at bigfoot.com
Possibly this will make it clearer: Clear[type, m, p, q, k] SetAttributes[type, HoldFirst]; type[arg : Sum[x_, it_]] = {"Sum", HoldForm[arg], arg}; type[arg : Times[x_, y_]] = {"Times", HoldForm[arg], arg}; type[x_Symbol] = {"Symbol", HoldForm[x], x}; m1[x_] := Module[{s = Sum[x, {i, 1, 20}]}, type[s]] m2[x_] := type[Evaluate@Sum[x, {i, 1, 20}]] m3[x_] := type[Sum[x, {i, 1, 20}]] m1[k] {Symbol,s$1748,20 k} m2[k] {Times,20 k,20 k} m3[k] {Sum,\!\( \*UnderoverscriptBox[\(\[Sum]\), \(i = 1\), \(20\)]k\),20 k} m1 passes s as a symbol (setting s beforehand has no effect), m2 evaluat= es = the sum to a product, and m3 passes the Sum unevaluated. Bobby On Wed, 10 Oct 2007 03:22:56 -0500, Todd Johnson <johnsong at ics.uci.edu> = = wrote: > I tried posting this on the Wolfram.com student forums, but got no = > response. A friend suggested that I try this forum as well. > > I have a Mathematica question I'm hoping someone here can help with, = > because it seems fundamental, but it's been bothering me for a long = > time. My basic question is "is there a way pass a local variable to a = = > function in a state between 'unevaluated' and 'evaluated,' which might= = > correspond to something like 'dereferenced.'" > > Here is a bit of code I've written which demonstrates the problem: > > Clear[L, M, P, Q, k] > SetAttributes[L, HoldFirst]; > > L[Sum[x_, it_]] := Print["here."]; > L[Times[x_, y_]] := Print["there."]; > L[x_Symbol] := Print["nowhere."]; > > M[x_] := > Module[{s}, > s = Sum[x, {i, 1, 20}]; > L[s] > ]; > P[x_] := > Module[{s}, > s = Unevaluated[Sum[x, {i, 1, 20}]]; > L[s] > ]; > Q[x_] := > Module[{s}, > s = Unevaluated[Sum[x, {i, 1, 20}]]; > L[Evaluate[s]] > ]; > > Let me try to explain/motivate this. Suppose that L is some function = > which cares about the difference between summation and multiplication,= = > and uses pattern matching to tell the difference. Suppose further that= L = > receives input from some other function. I've shown three ways of = > writing that function: M, P, and Q. Here are the three functions, with= = > their corresponding outputs: > > In: M[k] > Out: nowhere. > > In: P[k] > Out: nowhere. > > In: Q[k] > Out: there. > > None of these is what I want, which is "here," and which can be achiev= ed = > by passing input directly to L: > > In: L[Sum[k, {i, 1, 20}]] > Out: here. > > Why don't the three functions M, P, and Q work? M and P leave "s" = > completely unevaluated, so that what L actually receives is a value li= ke = > "s$123456". Q, on the other hand, evaluates "s" entirely, and arrives = at = > "20*k". You may wonder, "but wait, that is what s evaluates to, why = > can't your code deal with that?" The simplest answer is that sometimes= = > Mathematica seems to decide erroneously that the summation can be turn= ed = > into multiplication, which leaves me with dummy variables from = > summations lying around unbound. Also, this is a problem at other time= s, = > such as when there is an appreciable difference between "x[[i]]-x[[i]]= " = > and "0", because I really mean "x[[i]]" to stand in for some vector of= = > as-yet-unknown length, so that it minus itself is a zero vector, which= = > is different from plain 0. > > So, does anyone know of a way to write a function which gets the = > expression out of "s", but doesn't evaluate it completely? > > -- = DrMajorBob at bigfoot.com