Hallo Udo,
Am 17.09.09 21:54 schrieb "Udo und Susanne Krause" unter
<su.krause@XXXXXXX.ch>:
> Hallo zusammen,
>
>> Set will immer einem Symbol etwas zuweisen (so haben wir das gelernt)
>> und wenn man Part[{a, b, c, d}, 1] = 1 Schreibt , wem sollte hieretwas
>> zugewiesen werden ?
>
> Andreas will damit befehlen, dass a gleich 1 werde.
Also das Symbol a soll den Wert 1 zugewiesen bekommen.
Also "Aye aye Sir
Wie wär es einfach mit
a = 1"
Spass beiseite, verbal ausgedrückt, will er wohl
"weise Teil1 (etc.) des Ausdrucks expr, wie auch immer er aussehen möge, den
Wert1 (etc.) zu "
Und dass das (wegen des Set-Attributes HoldFirst) mit einem erforderlichen
Evaluate wohl geht, hast du dann ja sehr schön erläutert.
Warum aber , das sollte man vielleicht auch sagen, hat Set dieses Attribut ?
(meine Vermutung auf die Schnelle: um zu tiefe Evaluierung zu vermeiden)
Gruss Carsten
>
>> Schliesslich ist {a, b, c, d} ja ³nur² der Wert von pp , es ist nicht
>> identisch mit pp
>
> Von pp ist in der Codezeile Part[{a, b, c, d}, 1] = 1 keine Rede. Also,
> nocheinmal:
>
> In[18]:= Clear[a, b, c, d]
> {a, b, c, d}[[1]] = 1
> During evaluation of In[18]:= Set::"setps" : {a, b, c, d} in the part
> assignment is not a symbol. >>
> Out[19]= 1
> In[20]:= a
> Out[20]= a
>
> Keine Zuweisung an a. Warum nicht? Immerhin ist
>
> In[21]:= Head[{a, b, c, d}[[1]]]
> Out[21]= Symbol
> In[23]:= FullForm[{a, b, c, d}[[1]]]
> Out[23]//FullForm= a
>
> aber
>
> In[25]:= Attributes[Set]
> Out[25]= {HoldFirst, Protected, SequenceHold}
>
> Set[] hat Attribut HoldFirst. Daher
>
> In[27]:= Evaluate[{a, b, c, d}[[1]]] = 1
> Out[27]= 1
> In[28]:= a
> Out[28]= 1
>
> Okay und hoffentlich auch Bingo. Das war eine Zuweisung an a. Weiter
> schreiben Sie, Andreas,
>
>> Es ist zwar
>> In[30]:= pp == {a, b, c, d}
>> Out[30]= True
>> Aber: folgende Zuweisung funktioniert:
>> In[31]:= Part[pp, 1] = 1
>> Out[31]= 1
>> In[32]:= FreeQ[pp, a]
>> Out[32]= True
>> In[33]:= a
>> Out[33]= a
>
> Das Part[pp, 1] = 1 ist - wie bereits gestern festgestellt - eine
> Zuweisung an pp, nicht an a. pp soll an erster Stelle das Element 1
> enthalten. Der Wert von a interessiert dabei nicht, a verschwindet einfach
> aus der Liste:
>
> Part[pp, 1] = 1 ist gleichbedeutend mit pp /. a -> 1
>
> Es ist nicht möglich, hier einen Widerspruch zu konstruieren: Die
> Zuweisung von Elementen an die Liste pp hat nichts mit der Wertzuweisung
> an irgendein Element a (das sich auch in der Liste pp befinden kann) zu
> tun. Mit anderen Worten, die Wirkung von Set[] hängt von den auftretenden
> Operanden ab.
>
> Wenn dem ersten Element einer Liste ein Wert zugewiesen werden soll, tritt
> völlig konsistent der zuerst diskutierte Fall ein und man schreibt:
>
> In[50]:= Clear[pp, a, b, c, d]
> pp = {a, b, c, d}
> Out[51]= {a, b, c, d}
>
> In[52]:= Evaluate[Part[pp, 1]] = 1
> Out[52]= 1
>
> In[53]:= pp
> Out[53]= {1, b, c, d}
>
> In[54]:= a
> Out[54]= 1
>
> In[55]:= FreeQ[pp, a]
> Out[55]= False
>
> a ist immer noch in der Liste p und a hat den Wert 1.
>
> Gruss
> Udo.