Re: Why printing?
- To: mathgroup at yoda.physics.unc.edu
- Subject: Re: Why printing?
- From: tgayley (Todd Gayley)
- Date: Mon, 5 Apr 1993 09:44:06 -0600
Michael Trott <Michael.Trott at physik.tu-ilmenau.de> asks:
> Have a look at the following three examples:
> 1.)
> {a,b}/.{x___,a,y___}:>Print[z;x]
>
> This prints z!!!
>
> 2.)
> {a,b}/.{x___,a,y___}:>Print[z;]
> prints Null (O.K.)
>
> and
>
> 3.)
>
> {a,b}/.{x___,a,y___}:>Print[z;xx]
>
> prints xx (O.K.).
>
>
> The second and third behaviour is O.K. but why is z Printed in the first
> example.
>
> Any ideas??
You are seeing the behavior of Sequence, the magical disappearing head. In
your first example, after pattern matching, a gets a and y gets b. But what
does x become? It becomes Sequence[], which is, in effect, "nothing".
A Sequence beheads itself if it is an argument to _any_ function. In
particular, Sequence[] simply goes away:
In[1]:= f[a,b,Sequence[]]
Out[1]= f[a, b]
Thus, here is what happens in your Print statement:
before substitution: Print[CompoundExpression[z,x]]
after substitution: Print[CompoundExpression[z,Sequence[]]]
which becomes: Print[CompoundExpression[z]].
Compare this to Print[z;] in your second example, which is
Print[CompoundExpression[z,Null]].
The point of this is that when x "disappears" from Print[z;x], you get
Print[z], not Print[z;].
--Todd Gayley