Lieber Udo,
natürlich hat Du Recht, es ist unsinnig, absurd
und nicht besonders clever Part[] umzudefinieren,
weil dann alle Mathematica Packages die Part[]
benuzten
und von Leuten geschrieben worden sind, deren
geistige Fähigkeiten ausreichen um von Index-Basis
0 auf
Index-Basis 1 zu wechseln, nicht mehr korrekt
funktionieren.
Die Frage von Robert Nowak war aber
>>wünschenswert wäre es doch (nicht nur bei Part
>>sondern generell
>> bei allen system funktionen) bei umdefinition
>> von Part[]
>>innerhalb der neudefinition auf das originale
>>Part[] zugreifen zu können.
und die Antwort darauf, kann man nun mal nicht für
"die Definition eines nullbasierten Indexoperators
mit eigenen Symbolen"
geben.
Desweiteren kann man problemlos die Aufrufe an
solche Funktionen mit einem
Block[{hookPart = True,hookSet = True},...]
kapseln
Needs["NumericalMath`BesselZeros`"]
Block[{hookPart = True,hookSet = True},
a = BesselJZeros[Pi, 8]
]
wenn man ein Mathematica-Package benutzt. Gerade
deshalb
war es mir ja so wichtig, die hook*-Flags *nicht*
zu kapseln.
Ansonsten hat der OP ja erklärt, das er dieses
feature für das
prototyping benutzen will und in einem Prototyp
wird man
den Aufruf von Mathematica Packages vermeiden,
einfach weil
man diese Funktionen ja dann im C-Programm eh
nicht hat.
Insofern sollte es eher selten dazu kommen, daß
man die
BlockBlock[{hookPart = True,hookSet = True},...]
Version braucht,
falls doch gelingt es immer noch mit
SetOptions[originalEval,HoldAll]
originalEval[expr_]:=
BlockBlock[{hookPart = True,hookSet =
True},Evaluate[expr]]
diese Aufrufe im Prototyp vor dem modifizierten
Part[] zu
schützen ...
Gruß
Jens
PS: und ja, ich finde es überflüssig so etwas
*uberhaupt* zu machen
weil es ziemlich einfach ist ein
For[i=1,i<=n,i++,
lst[[i]]=something[i,x]
]
in
for(int i=0; i<n; i++)
lst[i]=something(i,x);
zu übersetzen. Die einzige Stelle die mir je als
problematisch aufgefallen ist, sind Pivot-Felder.
----- Original Message -----
From: "Udo und Susanne Krause"
<su.krause@XXXXXXX.ch>
To: "Nowak Robert" <robert.nowak@XXXXXXX.at>
Cc: "Jens-Peer Kuska"
<kuska@XXXXXXX.de>;
<demug@XXXXXXX.ch>; "Richard Gollreiter"
<RGollreiter@XXXXXXX.de>
Sent: Wednesday, March 15, 2006 10:07 PM
Subject: Re: Antwort: Re: Indizierung von Tables
mit Null beginnen.
| 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[];
| >
|
|