DMUG-Archiv 2008

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

Re: scoping Rule[]

Hallo,

wenn man nicht sehr genau weiss was man tut, soll man fuer Faelle, in denen die rechete Seite ein Pattern[] enthaelt RuleDealyed[] verwenden, sind keine Pattern[] drin Rule[]

Leider habe ich keine Ahnung was man sich unter " man sich das trivialerweise vorstellt" zu verstehen
ist.

(*3*)
{a, b} /. {x_, y_} -> {y, x}

liefert
{b, z}
weil die rechte Seite von Rule[] ausgewertet wird und dabei x durch z ersetzt wird
aus {x_, y_} -> {y, x} wird also {x_, y_} -> {y, z}

(*4*)

Block[{x, y}, {a, b} /. {x_, y_} -> {y, x}]

liefert

{b,a}

weil Block[] Wertzuweisungen an lokale Variablen zurueck setzt, also {x_,y_}->{y,x} zwar ausgewertet wird aber da x im Block[] keinen Wert mehr hat bleibt es so wie zuvor

(*5*)Module[{x, y}, {a, b} /. {x_, y_} -> {y, x}]

liefert

{b, z}

weil hier endlich die "Mathematica does appropriate renamings to avoid conflicts" zuschlaegt. In Module[{x, y}, {a, b} /. {x_, y_} -> {y, x}] wird angenommen dass sich das ausgewertete x in {a, b} /. {x_, y_} -> {y, x}] *nicht* auf die lokalen Variablen bezieht denn die heissen
in Wirklickeit ja eh anders (z. B. x$123, y$124) ...

(*6*)

{a, b} /. Block[{x, y}, {x_, y_} -> {y, x}]

liefert
{b, z}

weil im Block[] nix passiert, der Liefert aber {x_, y_} -> {y, x} zurueck und das Auswerten
der rechten Seite liefert dann {x_, y_} -> {y, z}

Bei

(*7*)

{a, b} /. Module[{x, y}, {x_, y_} -> {y, x}]

gibts wieder
{b,z}

weil es ja die "Mathematica does appropriate renamings to avoid conflicts" gibt, die
schon im Module[] das x mit z ersetzen.

Gruss
 Jens

Robert Nowak wrote:
liebe mma user folgendes simples problem welches die elemente eines 2er vektors vertauschen soll. es geht hier nicht darum das man das ja mit Reverse[] oder sonstwie bewerkstelligen kann !!
vielmehr geht es darum zu verstehen warum mma was wie macht ??

in der mma hilfe steht das patterns als lokale symbole behandelt werden:

tutorial/VariablesInPureFunctionsAndRules
"
Mathematica has several \[OpenCurlyDoubleQuote]scoping constructs\[CloseCurlyDoubleQuote] in which certain names are treated as local. When you mix these constructs in any way, Mathematica does appropriate renamings to avoid conflicts.
"

warum funktioniert das nicht wie man sich das trivialerweise vorstellt ?
insbesondere der fall 5 ist da sehr beunruhigend !
lediglich die fälle 2 und 4 scheinen das "intuitiv gewollte" zu vollbringen.

wer erleuchtet mich ?
soll man defaultmaessig RuleDelayed[] anstelle von Rule[] verwenden obwohl alle nullachtfünfzehn beispiele Rule[] verwenden ?

In[1]:= x = z;
(* 2 *) {a, b} /. {x_, y_} :> {y, x}
(* 3 *) {a, b} /. {x_, y_} -> {y, x}
(* 4 *) Block[{x, y}, {a, b} /. {x_, y_} -> {y, x}]
(* 5 *) Module[{x, y}, {a, b} /. {x_, y_} -> {y, x}]
(* 6 *) {a, b} /. Block[{x, y}, {x_, y_} -> {y, x}]
(* 7 *) {a, b} /. Module[{x, y}, {x_, y_} -> {y, x}]

Out[2]= {b, a}

Out[3]= {b, z}

Out[4]= {b, a}

Out[5]= {b, z}

Out[6]= {b, z}

Out[7]= {b, z}


glücklicherweise relativiert sich das problem bei verwendung von packages:
wobei Begin[] End[] alleine als klammerung nicht ausreichen ????

In[1]:= x = z;

BeginPackage["c`"];
Begin["Private`"];

(* 2 *) {a, b} /. {x_, y_} :> {y, x}
(* 3 *) {a, b} /. {x_, y_} -> {y, x}
(* 4 *) Block[{x, y}, {a, b} /. {x_, y_} -> {y, x}]
(* 5 *) Module[{x, y}, {a, b} /. {x_, y_} -> {y, x}]
(* 6 *) {a, b} /. Block[{x, y}, {x_, y_} -> {y, x}]
(* 7 *) {a, b} /. Module[{x, y}, {x_, y_} -> {y, x}]

End[];
EndPackage[];

Out[4]= {b, a}

Out[5]= {b, a}

Out[6]= {b, a}

Out[7]= {b, a}

Out[8]= {b, a}

Out[9]= {b, a}

beste grüße
Robert Nowak



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

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