Guten Abend,
mit dem von Jens-Peer modifizierten Part[] Operator bleibt die Zuweisung
weiterhin inkonsistent:
In[7]:= Needs["NumericalMath`BesselZeros`"]
In[8]:= a = BesselJZeros[Pi, 8]
Out[8]= {110.92, 29.1169, 6.5531, 19.6119, 38.5822, 44.8829, 38.5822,
32.2747}
In[9]:= a[[0]]
Out[9]= 110.92
In[10]:= a[[0]] = x
Out[10]= x
In[11]:= a[[0]]
Out[11]= 110.92
also a[[0]] != a[[0]] für das modifizierte Part[], a hat den Head
gewechselt (default Verhalten):
In[12]:= a
Out[12]= x[110.92, 29.1169, 6.5531, 19.6119, 38.5822, 44.8829, 38.5822,
32.2747]
Wenn man mit derselben Idee den Set[] Operator im Zusammenhang mit
Part[] modifiziert
In[1]:= Unprotect[Part, Set]
hookPart = False;
hookSet = False;
Verbatim[Part][a_, seq___] /; Not[ hookPart] :=
Block[{hookPart = True}, Part[a, Sequence @@ ( (# + 1) & /@ {seq})]]
Verbatim[Set][Verbatim[Part][a_, seq___], b_] /; Not[ hookSet] :=
Block[{hookSet = True}, Set[Part[a, Sequence @@ ( (# + 1) & /@
{seq})], b]]
Protect[Part, Set]
sieht das Ergebnis scheinbar gut aus:
In[7]:= a = {110.92, 29.1169, 6.5531, 19.6119, 38.5822, 44.8829,
38.5822, 32.2747};
In[8]:= a[[0]]
Out[8]=110.92
In[9]:= a[[0]] = x
Out[9]=x
In[10]:= a[[0]]
Out[10]= x
In[11]:= a
Out[11]= {x, 29.1169, 6.5531, 19.6119, 38.5822, 44.8829, 38.5822, 32.2747}
Berechnet man die Bessel Nullstellen mit dem modifizierten Set[] nocheinmal:
In[12]:= Needs["NumericalMath`BesselZeros`"]
In[13]:= a = BesselJZeros[Pi, 8]
Out[13]= {3896.58, 10^-6, 1006.31, 10^-6, 186.336, 13.2095, 66.9094,
32.2747}
dann zeigt sich, dass es wiederum fehlerhaft ist. Im BesselZeros-Paket
wird die Zuweisung auf Listenelemente verwendet, das geht jetzt an
andere Positionen und die Numerik ist verloren (* "brauchbar" höchstens
für Mma-Würmer, die solche Modifikationen in jemandes init.m Datei
eintragen *). Nun kann man vor dem Aufruf von Mma-Package-Fktnen die
Modifikationen abzuschalten versuchen, wandert von einem Problem zu
nächsten und erleidet eine Art Chemotherapie des Symbolismus.
Der richtige Weg ist m.E. die Definition eines nullbasierten
Indexoperators mit eigenen Symbolen, dazu wird Anleitung gegeben im
HelpBrowser->Demos->Notebooks->New Notations.
Gruss
Udo.
Nowak Robert wrote:
BeginPackage["MyPart`"];
Part::usage="Part originated form 0 instead of 1";
Begin["`Private`"];
hooked=True;
Unprotect[Part];
Part[a_List, seq__] /; hooked :=
Block[{hooked = False}, Part[a, Sequence @@ ( # + 1 & /@ {seq})]];
Protect[Part];
End[];
EndPackage[];