3 replaced http://mathematica.stackexchange.com/ with https://mathematica.stackexchange.com/ edited Apr 13 '17 at 12:56 The two standard approaches to this problem, Unevaluated and Listable, have already been posted. If you need a different kind of evaluation control please consider my original method:(1)(1),(2)(2),(3)(3),(4)(4) SetAttributes[f2, HoldAll] f2[s_Symbol] := step[s] /. {_[x_List] :> f2 /@ Unevaluated[x], _ :> ValueQ[s]}  Now: x = 1; q := {x, y, z}; f2[q]  {True, False, False}  The two standard approaches to this problem, Unevaluated and Listable, have already been posted. If you need a different kind of evaluation control please consider my original method:(1),(2),(3),(4) SetAttributes[f2, HoldAll] f2[s_Symbol] := step[s] /. {_[x_List] :> f2 /@ Unevaluated[x], _ :> ValueQ[s]}  Now: x = 1; q := {x, y, z}; f2[q]  {True, False, False}  The two standard approaches to this problem, Unevaluated and Listable, have already been posted. If you need a different kind of evaluation control please consider my original method:(1),(2),(3),(4) Load step How do I evaluate only one step of an expression? then: SetAttributes[f2, HoldAll] f2[s_Symbol] := step[s] /. {_[x_List] :> f2 /@ Unevaluated[x], _ :> ValueQ[s]}  Now: x = 1; q := {x, y, z}; f2[q]  {True, False, False}  2 simplify answer and examples to reduce obfuscation of method edited Mar 5 '15 at 20:32 Mr.Wizard♦ 235k3030 gold badges488488 silver badges10901090 bronze badges The two standard approaches to this problem, Unevaluated and Listable, have already been posted. If you need a different kind of evaluation control please consider my original method:(1),(2),(3),(4) SetAttributes[f2, HoldAll] f2[s_Symbol] := step[s] /. {HoldForm[x_List]_[x_List] :> f2 /@ Unevaluated[x], HoldPattern[s] :> False, _ :> TrueValueQ[s]}  Now: x = 1; q := {x, y, z}; f2[q]  {True, False, False}  This uses step in place of ValueQ. To keep the behavior of ValueQ one may use: SetAttributes[f3, HoldAll] f3[s_Symbol] := With[{x = step[s]}, (x /. _[z_] :> f3 /@ Unevaluated[z]) /; MatchQ[x, HoldForm[_List]] ] f3[s_Symbol] := ValueQ[s]  The two standard approaches to this problem, Unevaluated and Listable, have already been posted. If you need a different kind of evaluation control please consider my original method:(1),(2),(3),(4) SetAttributes[f2, HoldAll] f2[s_Symbol] := step[s] /. {HoldForm[x_List] :> f2 /@ Unevaluated[x], HoldPattern[s] :> False, _ :> True}  Now: x = 1; q := {x, y, z}; f2[q]  {True, False, False}  This uses step in place of ValueQ. To keep the behavior of ValueQ one may use: SetAttributes[f3, HoldAll] f3[s_Symbol] := With[{x = step[s]}, (x /. _[z_] :> f3 /@ Unevaluated[z]) /; MatchQ[x, HoldForm[_List]] ] f3[s_Symbol] := ValueQ[s]  The two standard approaches to this problem, Unevaluated and Listable, have already been posted. If you need a different kind of evaluation control please consider my original method:(1),(2),(3),(4) SetAttributes[f2, HoldAll] f2[s_Symbol] := step[s] /. {_[x_List] :> f2 /@ Unevaluated[x], _ :> ValueQ[s]}  Now: x = 1; q := {x, y, z}; f2[q]  {True, False, False}  1 answered Mar 5 '15 at 20:16 Mr.Wizard♦ 235k3030 gold badges488488 silver badges10901090 bronze badges The two standard approaches to this problem, Unevaluated and Listable, have already been posted. If you need a different kind of evaluation control please consider my original method:(1),(2),(3),(4) SetAttributes[f2, HoldAll] f2[s_Symbol] := step[s] /. {HoldForm[x_List] :> f2 /@ Unevaluated[x], HoldPattern[s] :> False, _ :> True}  Now: x = 1; q := {x, y, z}; f2[q]  {True, False, False}  This uses step in place of ValueQ. To keep the behavior of ValueQ one may use: SetAttributes[f3, HoldAll] f3[s_Symbol] := With[{x = step[s]}, (x /. _[z_] :> f3 /@ Unevaluated[z]) /; MatchQ[x, HoldForm[_List]] ] f3[s_Symbol] := ValueQ[s]