[Date Index]
[Thread Index]
[Author Index]
HoldFirst, Unevaluated
*To*: mathgroup at smc.vnet.net
*Subject*: [mg109600] HoldFirst, Unevaluated
*From*: Fred Klingener <gigabitbucket at BrockEng.com>
*Date*: Fri, 7 May 2010 06:30:47 -0400 (EDT)
Here, the second execution of f fails because variable 'a' evaluates
to Pi and can't be reassigned:
ClearAll[f, a, b, c]
f[x_, y_, z_] := x = Pi; 3 y + 2 z
f[a, b, c]
f[a, b, c]
I have come to understand that the canonical approach to control this
is to assign the HoldFirst attribute to f:
ClearAll[f, a, b, c]
SetAttributes[f, HoldFirst]
f[x_, y_, z_] := x = Pi; 3 y + 2 z
f[a, b, c]
f[a, b, c]
a
and, indeed, this works as intended.
Plan B, using an explicit Unevaluated also works:
ClearAll[f, a, b, c]
f[x_, y_, z_] := x = Pi; 3 y + 2 z
f[Unevaluated[a], b, c]
f[Unevaluated[a], b, c]
a
An alternate function formulation fails, evidently in the same way as
the first example:
ClearAll[f, a, b, c]
SetAttributes[f, HoldFirst]
f = (#1 = Pi; 3 #2 + 2 #3) &
f[a, b, c]
f[a, b, c]
a
while
ClearAll[f, a, b, c]
f = (#1 = Pi; 3 #2 + 2 #3) &
f[Unevaluated[a], b, c]
f[Unevaluated[a], b, c]
a
does.
What am I missing?
TIA,
Fred Klingener
Prev by Date:
**Re: NDSolve backward in time**
Next by Date:
**RuleDelayed for parsing XML with multiple children**
Previous by thread:
**Re: matrix equation**
Next by thread:
**Re: HoldFirst, Unevaluated**
| |