DMUG-Archiv 2008

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: scoping Rule[]

Hallo Robert,

ich soll und werde im Zweifelsfall RuleDelayed[] bei rhs Pattern[] verwenden
<snip>

sehe ich zwar nicht 100%ig ein warum aber dafür hilft es.

Warum? Weil Ihre Formulierung ein Schreibfehler ist, mit anderen Worten: die Variablen (des Patterns) werden in den Module[] injiziert, es müsste eine Rückwärtsreferenz vom Auswertungsbereich in den Definitionsbereich des Module[] erfolgen.

In[10]:= x = z;
        (* a bugs life *)
        {a, b} /. Module[{x, y}, {x_, y_} -> {y, x}]
Out[11]= {b, z}

Eine korrekte Formulierung mit Module[] funktioniert und verwendet nicht etwa Set[], sondern SetDelayed[].

In[13]:= Clear[nowakR]
        nowakR[x_, y_] := Module[{}, {x, y} -> {y, x}]

In[15]:= {a, b} /. nowakR[a, b]
Out[15]= {b, a}

In[16]:= x
Out[16]= z

Das Leben und Leiden des Schreibfehlers kann man anschauen:

In[19]:= TracePrint[{a, b} /. Module[{x, y}, {x_, y_} -> {y, x}]]
  {a,b}/.Module[{x,y},{x_,y_}->{y,x}]
   ReplaceAll
   {a,b}
    List
    a
    b
   Module[{x,y},{x_,y_}->{y,x}]
    Module
    {x_,y_}->{y,x}
     Rule
     {x_,y_}
      List
      x_
       Pattern
       _
      y_
       Pattern
       _
     {y,x}
      List
      y
      x
      z
     {y,z}
    {x_,y_}->{y,z}
    {x_,y_}->{y,z}
     Rule
     {x_,y_}
     {y,z}
   {x_,y_}->{y,z}
  {a,b}/.{x_,y_}->{y,z}
  {b,z}
   List
   b
   z
Out[19]= {b,z}

Gruss
Udo.
--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/


Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html