Re: MyPrependTo
- To: mathgroup at smc.vnet.net
- Subject: [mg15979] Re: [mg15921] MyPrependTo
- From: "Wolf, Hartmut" <hwolf at debis.com>
- Date: Fri, 19 Feb 1999 03:27:01 -0500
- Organization: debis Systemhaus
- References: <199902180433.XAA11530@smc.vnet.net.>
- Sender: owner-wri-mathgroup at wolfram.com
Dear Will Will Self schrieb: > > In trying to create my own version of PrependTo, I ran into some strange > stuff that I don't understand. I am calling my function "push". Please > look at the session below and explain these mysterious happenings. > It seems clear that there is more than one symbol e kicking around, > but I can't make head or tail of it. See also my next message for > the larger context. > > In[2]:= > push[someStack_, elt_] := (someStack = Prepend[someStack, elt];) > > In[3]:= > e=stack["expression"] > Out[3]= > stack["expression"] > > In[4]:= > push[e,1] > > In[5]:= > e > Out[5]= > stack[1,"expression"] > > In[6]:= > push[e,2] > > In[7]:= > e > > Out[7]= > stack[2,1,"expression"] > > In[8]:= > Rest[e] > Out[8]= > stack[2,1,"expression"] (* WHAT!!!!???? *) > > In[9]:= > ?e > "Global`e" > e = stack["expression"] (* DOUBLE WHAT!!!!???? *) > > Will Self You will understand, if you carefully track down, what you really did. The basic misunderstanding probably comes from the evaluation of push[e, 1] *after* you had given a value to e! Executing > push[e,1] means executing Evaluate[e] = Prepend[Evaluate[e], 1] which effectively defines a *rule* for stack !! Repeating > push[e,2] defines *another* rule for stack, and everything else is a consequence of evaluating those rules!! Will, I have sent you a nb with explanations too detailed to give here. (Whoever wants to have it, be free to request from [mailto:hwolf at debis.com]) For a nice little tool use allValues={{"attributes:",Attributes[#]}, {"default values:",DefaultValues[#]}, {"down values:",DownValues[#]}, {"format values:",FormatValues[#]}, {"messages:",Messages[#]}, {"N values:",NValues[#]}, {"options:", Options[#]}, {"own values:", OwnValues[#]}, {"up values:",UpValues[#]}}&; allValues[Unevaluated[e]]//TableForm To come close to what I suppose you intended to do, I suggest: makeStack::nosymbol = "`1` is not a symbol"; makeStack[x_] := Message[makeStack::nosymbol, x] makeStack[ss_Symbol] := (Module[{stack}, ss[push] := (stack = Prepend[stack, #];)&; ss[pop] := Block[{s}, If[Length[stack]>0,s=First[stack]; stack=Rest[stack]; s, Print["stack empty"] ]]; ss[clear] := (stack = {};); Print["new stack ", ss ] ]; ss[clear]) And call as: a=.;makeStack[a] ---your's Hartmut Hartmut Wolf, debis Systemhaus, Darmstadt, Germany =======[mailto:hwolf at debis.com]=======
- References:
- MyPrependTo
- From: wself@viking.emcmt.edu (Will Self)
- MyPrependTo