Re: Releasing several Holds simultaneously

*To*: mathgroup at smc.vnet.net*Subject*: [mg82271] Re: Releasing several Holds simultaneously*From*: "Szabolcs HorvÃt" <szhorvat at gmail.com>*Date*: Wed, 17 Oct 2007 03:46:17 -0400 (EDT)*References*: <ff1po5$90n$1@smc.vnet.net> <47147224.60309@gmail.com>

On 10/16/07, Andrew Moylan <andrew.j.moylan at gmail.com> wrote: > Hi Szabolcs, > > My general expression is of the form Hold[SetDelayed[a, b]] where both a and > b may contain one or more Holds. The expression is the result of using > Mathematica to generate Mathematica code. > > I start with Hold[SetDelayed[a, b]] and then insert (via /. and > placeholders) code into b. The reason b contains Holds is that some of the > pieces of code that I insert into it are wrapped in Hold because they can't > be evaluated: > > pieceofcode = Hold[z[[1]]]; > > So I could generalise my question like this: > > Suppose I have Hold[a := b] and I have pieceofcode = Hold[z[[1]]]. How can I > arrange to evaluate a := z[[1]]? > > Here's my present solution: > > SetAttributes[SuperHold, HoldAll]; > ReleaseSuperHold[expr_] := expr /. SuperHold[x_] :> x; > > pieceofcode = Hold[z[[1]]]; > SuperHold[a := b] /. b -> pieceofcode // > ReleaseHold // ReleaseSuperHold; > > Andrew > Here's an alternative: In[1]:= z={1,2,3} Out[1]= {1,2,3} In[2]:= pieceofcode:=Hold[z[[1]]] In[3]:= toBeAssginedTo=a Out[3]= a In[4]:= Function[{val},Evaluate[toBeAssginedTo]:=val,{HoldAll}]@@pieceofcode In[5]:= ?a Global`a a:=z[[1]] You could also "Block out" (Block[{z}, ...]) 'z' and other variables instead of Holding them, but this may not work for all types of code; or wrap expressions containing 'z' in Unevaluated while you pass them on. It all depends one exactly what kind of Mathematica code are you building (z[[1]] was of course a simplified example): In[1]:= SetAttributes[fun,HoldRest] In[2]:= fun[a_,z_]:=a:=Unevaluated[z[[1]]] In[3]:= z={1,2,3} Out[3]= {1,2,3} In[4]:= fun[a,z] In[5]:= ?a Global`a a:=z[[1]]