I'm applying the Trott-Strzebonski technique in order to replace inside a held expression.
x = Hold[1 + 1, 2 + 2, 3 + 3]; y = Hold[foo@bar[2]]; y /. bar[j_] :> With[{eval = x[[j]]}, eval /; True] (* Hold[foo[4]] *) However, I'd like the replacing expression to remain held during substitution:
(* Hold[foo[2 + 2]] *) The unwanted evaluation of 2 + 2 seemed to be occurring during the Part statement, x[[j]]. So, I tried using Extract instead:
y /. bar[j_] :> With[{eval = Extract[x, {j}, Unevaluated]}, eval /; True] (* Hold[foo[Unevaluated[2 + 2]]] *) I thought Unevaluated would disappear as an argument of the Set function, but this was not so. (Perhaps I still don't quite understand Unevaluated.)
I then thought of removing that head, Unevaluated, through another replacement, but that seems rather convoluted.
Succinctly, how does one replace parts of a held expression with held parts of another expression?