Re: Releasing several Holds simultaneously
- To: mathgroup at smc.vnet.net
- Subject: [mg82311] Re: Releasing several Holds simultaneously
- From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
- Date: Wed, 17 Oct 2007 04:06:51 -0400 (EDT)
- References: <ff1po5$90n$1@smc.vnet.net>
Hi,
I love such questions ! Try:
RemoveInnerHold[expr_] :=
Module[{syms, rep, nexpr},
syms = Cases[expr,
Except[Hold | HoldComplete | HoldPattern | HoldForm, _Symbol],
Infinity, Heads -> True];
rep = Thread[syms -> Table[Unique[], {Length[syms]}]];
nexpr = (expr /. rep) //. Hold[any_] :> any;
nexpr /. (Reverse /@ rep)
]
while
Hold[Hold[q] + Hold[c] + Hold[2 + 3 + 4]] // ReleaseHold
gives
Hold[2 + 3 + 4] + Hold[c] + Hold[q]
but
RemoveInnerHold[Hold[Hold[q] + Hold[c] + Hold[2 + 3 + 4]]]
gives
9+c+q
Regards
Jens
Andrew Moylan wrote:
> Hold[a := Hold[1]]
>
> How can I release both of these Holds (and thus execute a:=1)
> simultaneously?
>
> ReleaseHold[%] doesn't work; it evaluates a := Hold[1] before the other hold
> is removed.
>
> % /. Hold[x_]:>x does the same thing, because /. only matches once per part.
>
>