Re: implementing a stack
- To: mathgroup at smc.vnet.net
- Subject: [mg16052] Re: [mg15922] implementing a stack
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Mon, 22 Feb 1999 01:44:32 -0500
- References: <7alphl$no8@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Clemens Frey wrote in message <7alphl$no8 at smc.vnet.net>...
>Hi Will!
>Although Bob has already posted a solution, here is mine. I strongly use
>the Hold-Attribute to keep the function arguments from being evaluated.
>But as I want to implement a little own data type, I want to test if the
>right stuff is being given to the push/pop functions, so I have to use a
>conditioned pattern together with a ReleaseHold just to evaluate the
>argument when I want. Be careful to define the pop fct exactly in the
>given order, since Mathematica cannot decide which condition is more
specific
>here. The first pop-rule just returns Null if an empty stack is given to
>it. Instead of the very inefficient Prepend-fct I use a Flatten-construct.
>
>init := TStack[];
>
>SetAttributes[push,HoldFirst];
>push[ s_Symbol/;Head[ReleaseHold[s]]==TStack, elem_ ] :=
> (s = Flatten[TStack[elem,s]];)
>
>SetAttributes[pop,HoldAll];
>pop[ s_Symbol /;ReleaseHold[s]==TStack[] ] = Null;
>pop[ s_Symbol /;Head[ReleaseHold[s]]==TStack ] :=
> {First[s],s = Rest[s]} [[1]]
>
>Now you can use these definitions:
>
>s = init;
>
>push[s,2]
>
>push[s,xx]
>
>pop[s]
>xx
>
>pop[s]
>2
>
>pop[s] //FullForm
>Null
>
>Bye
>Clemens
>
>------------------------------------------------------------
>Clemens Frey
>Doctoral Student at the
>Department of Mathematics/BITOEK
>University of Bayreuth(Germany)
>
>clemens.frey at uni-bayreuth.de
>http://www.bitoek.uni-bayreuth.de/~Clemens.Frey
>------------------------------------------------------------
Clemens:
We do not need to release holding in conditions and tests - it is done
automatically:
ClearAll[f]
SetAttributes[f,HoldFirst]
f[y_/;Head[y]==H]:= 3;
z = H[8];
{f[y],f[8]}
{3,f[8]}
Clear[f]
f[y_?(Head[#]==H&)]:= 4
{f[z],f[p]}
{4,f[p]}
Also, ReleaseHold is for cancelling the hold functions (Hold, HoldComplete
..), not the hold attributes (HoldFirst, ...). The latter are cancelled by
Evaluate:
u = 6;
Attributes[Hold]
{HoldAll,Protected}
{ReleaseHold[Hold[u]],Evaluate[Hold[u]]}
{6,Hold[u]}
{Hold[ReleaseHold[u]],Hold[Evaluate[u]]}
{Hold[ReleaseHold[u]],Hold[6]}
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565