MathGroup Archive 2003

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: New version, old bugs

  • To: mathgroup at smc.vnet.net
  • Subject: [mg44194] Re: New version, old bugs
  • From: Maxim <dontsendhere@.>
  • Date: Sun, 26 Oct 2003 00:41:48 -0400 (EDT)
  • References: <bn5e16$6ba$1@smc.vnet.net> <bnaouu$4j3$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

I think there are some issues with how Unevaluated is parsed by some of
Mathematica functions. Consider

In[1]:=
Module[
  {L = {}},
  L = Append[L, Unevaluated @ Sequence[a,b]]
]

Module[
  {L = {}},
  AppendTo[L, Unevaluated @ Sequence[a,b]]
]

Out[1]=
{a,b}

Append::argrx: Append called with 3 arguments; 2 arguments are expected.

Out[2]=
Append[{},a,b]

which means that what the description of AppendTo in the Reference says
("AppendTo[s, elem] is equivalent to s = Append[s, elem]") is not quite true.
What seems to happen here is that firstly Unevaluated @ Sequence[a,b] is
evaluated as the second argument of AppendTo (and Unevaluated gets stripped) and
then AppendTo is internally rewritten as L = Append[L, Sequence[a,b]] (and
Sequence[a,b] is evaluated and spliced in). So to get the desired result we
should use

In[2]:=
Module[
  {L = {}},
  AppendTo[L, Unevaluated @ Unevaluated @ Sequence[a,b]]
]

Out[2]=
{a,b}

but how should one figure it out, except by educated guessing? Or consider

In[1]:=
Unevaluated @ D[y,x] /. {y -> x}
Unevaluated @ D[y,x] /. {{y -> x}}

Out[1]=
1

Out[2]=
{0}

Here we can see that {ReplaceAll[expr,{rule}]} is not equivalent to
ReplaceAll[expr,{{rule}}], contrary to what notes for Replace say. In the second
case two Unevaluated wrappers are needed as well -- three for three levels of
rule nesting and so on. But once again, a user can see only one function,
ReplaceAll, acting on Unevaluated, why should he bother about internal
transformations?

Another example:

In[1]:=
Module[{x}, x = Unevaluated[1 + 1]]
Module[{x = Unevaluated[1 + 1]}, x]

Out[1]=
2

Out[2]=
Unevaluated[1 + 1]

This is the same problem in disguise: in one case Unevaluated is processed as
the argument of Set, in the other Set is not called. Another -- unrelated --
issue is

In[1]:=
Unevaluated[1 + 1] == 2

Out[1]=
Unevaluated[1 + 1] == 2

The fact that Unevaluated doesn't disappear in this case is well known, but it
seems to contradict what section "A.4.1 The Standard Evaluation Sequence" of the
Book says.

Maxim Rytin
m.r at prontomail.com



  • Prev by Date: AW: Re: Baffling Failure when plotting multiple curves.
  • Next by Date: Re: Re: extracting variables from an expression
  • Previous by thread: Re: Re: New version, old bugs
  • Next by thread: Re: New version, old bugs