Controlling evaluation

*To*: mathgroup at smc.vnet.net*Subject*: [mg83706] Controlling evaluation*From*: magma <maderri2 at gmail.com>*Date*: Wed, 28 Nov 2007 05:47:10 -0500 (EST)

I am building a package and I need to programmatically construct expressions . At a certain point I have arg1 = {a, b, c}; (* some list *) arg2 = {d, e, f}; (* some other list *) samelistQ[list1_List, list2_List] := list1 === list2 (* some logic function *) Now I want to construct an expression like Condition[expr, samelistQ[arg1, arg2]] with arg1 and arg2 evaluated, but with samelist[...] not evaluated. In other words, I want to obtain exactly this Condition[expr, samelistQ[{a, b, c}, {d, e, f}]] where the 2 args have been evaluated, but samelistQ[...] appears always unevaluated What is expr is not important, just leave it unassigned. The problem is that Condition blocks the evaluation of arg1 and arg2 and of samelistQ. Now, doing Condition[expr, samelistQ[arg1 // Evaluate, arg2 // Evaluate]] does not work, because Evaluate does not disappear. So what to do? I tried Hold, ReleaseHold, ect, but it didn't work. This is how I solved it Condition @@ List[expr, pp[arg1, arg2]] /. pp -> samelistQ where pp is an unassigned symbol. My question: isn't there a better way, using the functions which are supposed to control evaluation (Hold, Evaluate, ect) to achieve this result? Perhaps a related more general question: how do we block f[x,y] while allowing evaluation of x, and y ? Thank you in advance for any comment

**Follow-Ups**:**Re: Controlling evaluation***From:*Carl Woll <carlw@wolfram.com>