Hallo Richard und Patrick,
das (echte) Part[] lässt sich mit Unprotect[] und Protect[] behandeln,
weil Part[] nicht das Attribute Locked hat.
In dem Fall ist es aber schwierig, das Unangenehme mit dem Nutzlosen zu
verbinden:
In[13] := Clear[gollreiterTable, shiftedPart]
gollreiterTable[n_Integer?NonNegative, type_Symbol] :=
Table[Random[type], {n}] /; (type === Integer || type === Real || type
=== Complex);
shiftedPart[x_List, n_Integer] := First[RotateLeft[x, n]];
(*
Unprotect[Part]
Part /; Part[x_List, n_Integer] := shiftedPart[x, n];
Protect[Part]
*)
In[18]:=
Clear[a];
a = gollreiterTable[5, Complex]
Out[19]=
{0.241481 + 0.138648 I, 0.473792 + 0.952719 I, 0.905932 +0.628482 I,
0.36624 + 0.259079 I, 0.318215 + 0.303649 I}
In[20]:= shiftedPart[a, 0]
Out[20]= 0.241481 +0.138648 I
In[22]:= shiftedPart[a, 0] == shiftedPart[a, Length[a]]
Out[22]= True
Soweit so gut. Den auskommentierten Teil können Sie erst dann
aktivieren, wenn Sie in shiftedPart[] eine Zugriffsmethode auf die
Elemente einer Liste gefunden haben, die vollständig unabhängig von
Part[] ist - anderenfalls laufen Sie in eine unendliche Rekursion,
freundlicherweise von Mma. beim $RecursionLimit unterbrochen. First[]
ist zu diesem Zweck selbstverständlich ungeeignet, Versuche mit Take[_,
{1, 1}], Pick[] usw. haben auch keinen Erfolg gehabt.
Gruss
Udo.
Patrick Scheibe wrote:
Moin.
Also der echte [[]] Operator laesst sich nicht umbiegen glaub ich.
Das waer auch fatal, weil ja fast jede Funktion darauf zurueck greift.
Falls es wirklich von Noeten ist, dann kann man sich natuerlich einen Wrapper
um die eigentliche Funktion Part[] schreiben. Nur das ist noch viel
unintuitiver, denn expr[[0]] gibt den Head der expr zurueck.
Bei C/C++ liegt die Sachlage ja anders. Dort hat man ja Pointer und die Zahl
in den Brackets gibt nur die Verschiebung diese Pointers an.
In MMA kann man mit dem Part[] Operator sich Teile jeder Expression geben
lassen. Nicht nur bei Listen..
Cheers
Patrick
On Tuesday 07 March 2006 12:29, Richard Gollreiter wrote:
Hallo Demug,
gibt es einen Trick, wie ich Tables mit Null beginnend indizieren kann (wie
in C)?
Ein Beispiel hierzu:
In[27]:= T=Table[i,{i,0,9}]
Out[27]= {0,1,2,3,4,5,6,7,8,9}
In[28]:= T[[1]]
Out[28]= 0
Ich möchte aber mit Indizes 0 ..9 auf die Tabelle zugreifen können
anstatt mit 1..10 .
Danke
Richard Gollreiter
------------------------------------------------------------------