hi leute,
also da muss ich mich selbstverständlich auch mal dazu äussern.
meine persönliche subjektive meinung: Goto[] ist in MMA absolut überflüssig und deplaziert.
mehrere Return[] (letztlich auch sprünge) sind da kaum besser und ebenfalls überflüssig nichts desto trotz gut das es
sie der vollständigkeit halber giebt.
die wenigen fälle welche tatsächlich an übersichtlichkeit durch verwendung von Goto[] gewinnen sind mit sicherheit
durch überlegtes programmieren zu allermindest ebenso elegant hinzukriegen.
das goto's auf maschinenebene ihre berechtigung haben ist soweit klar.
auch ich bin mit fortran gestraft, doch auch älterer fortran code verzichtet soweit er gut geschrieben ist
weitestgehendst auf goto's
muss allerdings gestehen das ich vor allem zur fehlerbehandlung in funktionen gerne zu Abort[] das ja auch einen sprung
dastellt greife um alle ausführung zu beenden, da gehts dann allerdings auch nirgends spaghetti code mässig weiter.
l.g. robert
-----Original Message-----
From: klamser [mailto:klamser@XXXXXXX.de]
Sent: Tuesday, April 26, 2005 11:25 PM
To: Jens-Peer Kuska
Cc: Christian M. Sperber; demug@XXXXXXX.ch
Subject: Re: iteration (und Goto)
Hallo,
1980 habe ich in meinem Ingenieurstudium mit Pascal begonnen, da gab es auch Goto, aber das war streng verboten und das
ist richtig so. Natürlich muss ich in Assembler Sprünge programmieren können, aber MMA hat wohl andere Eigenheiten (@@
/@ etc.), die geeigneter sind hier erwähnt zu werden. Ein Computer ist eine Maschine, mit der man alle anderen
Maschinen simulieren kann, also auch eine Basicmaschine. MMA ist natürlich bestens geeignet, sich in diese
Simulationsmaschinen einzureihen, das hat Herr Mäder mit der Prologmaschine gezeigt. Aber Goto und Label ist nach
meiner Meinung doch ein sehr fragwürdiges Konstrukt. Tatsächlich wurde Goto mit dem Beitrag von Herrn Sperber in diesem
Forum zum ersten mal erwähnt! Wahrscheinlich kommt man also sehr gut ohne aus....
Zum Aufräumen eignet sich vielleicht Return[AufräumenTeil1; AufräumenTeil2] besser.
Sonst hat Jens-Peer fast immer Recht.
Gruß
Peter
Jens-Peer Kuska wrote:
Hallo,
Peter hat
a) recht das es schon schön wäre t einen numerischen
Wert zuzuweisen.
z. B. sollte
Subdivide[lst_] := Drop[
Flatten[
Transpose[{lst, Append[0.5*Plus @@@ Partition[lst, 2, 1], 1]}]], -1]
Subdivide[lst_, n_] := Nest[Subdivide, lst, n]
y = {0, 1}; Label[begin]; y = Subdivide[y]; If[y[[2]] > 0.01, Goto[begin], y]
recht gut funktionieren.
b) unrecht wenn er etwas gegen Goto[] hat. Goto[] kann eine Funktion sogar übersichtlicher und weniger fehleranfällig
machen. Das klassische Beispiel dafür ist das Abbrechen einer Funktion, die erst einmal allerhand Dinge initialisiert
die beim Ende der Funktion wieder aufgeräumt werden sollen also z. B
SomeFunction[x_]:=Module[{y},
y=x;
a=Table[y^2,{Length[y]}];
b=Sqrt[y];
If[y[[1]]>2,Goto[exit]];
If[a[[3]]>4,Goto[exit]];
If[b[[4]]>5,Goto[exit]];
Label[exit];
a={}; b={};
]
Natürlich kann man auch jedes mal
SomeFunction[x_]:=Module[{y},
y=x;
a=Table[y^2,{Length[y]}];
b=Sqrt[y];
If[y[[1]]>2,a={}; b={};Return[]];
If[a[[3]]>4,a={}; b={};Return[]];
If[b[[4]]>5,a={}; b={};Return[]];
a={}; b={};
]
schreiben aber das ist sicher nicht die beste Lösung. Ähnlich wäre es, wenn man die eine Datei schreibt, die (egal was
passiert) am Ende geschlossen werden muß. Natürlich kann man auch hier auch eine lokale Funktion machen, aber
eigentlich ist an einem solchen Goto[] nichts auszusetzen.
.. und eigentlich erwarte ich, das Goto's noch an deutschen Hochschulen gelehrt werden. Zum einen, weil die meisten
Maschinensprachen ein Goto brauchen -- und Assembler sollte ein Informatiker schon können, wenigstens ein bischen. Zum
anderen, weil es Millionen von Zeilen FORTRAN Code gibt den keiner neu schreiben will, der immer noch benutzt wird und
den man auch lesen können sollte. Kann es schöneres geben als ein Berechnetes GOTO ? eigentlich nicht -- oder ?
.. und ich nehme Mathematica auch gern um einen Algorithmus auszuprobieren, den ich dann in einem C-Programm oder
FORTRAN Programm brauche. In so einem Fall werde ich keine Map[]s, Apply[]s oder sonst was benutzen, sonder ordentliche
For[], Do[] oder auch Goto[]s. Damit beim Übertragen in C oder FROTRAN nicht so viel schief gehen kann.
Gruß
Jens
----- Original Message ----- From: "klamser" <mailto:klamser@XXXXXXX.de> <klamser@XXXXXXX.de>
To: "Christian M. Sperber" <mailto:sperber.christian@XXXXXXX.de> <sperber.christian@XXXXXXX.de>
Cc: <mailto:demug@XXXXXXX.ch> <demug@XXXXXXX.ch>
Sent: Sunday, April 24, 2005 11:58 PM
Subject: Re: iteration
Hallo Herr Sperber ,
au weia, eine wirklich vollständige Implementation einer Programmiersprache kennt auch Label und Goto. Sogar seit der
Version 1 (sagt zumindest das Hilfesystem).
Also: Das Problem hier ist, dass y3=t gesetzt werden soll, t aber nicht bekannt ist. Also sollte man vorher t einen
Wert zuweisen. Und dazwischen erneut, sonst läuft das ewig..... Das geht übrigens in Basic genau so.
Also zum Zweiten: Man kann sich natürlich in die Analen von Mathematica.ch eintragen, indem wie vor 30 Jahren
programmiert wird und Label und Goto nutzt. Ich weiß nicht, wo einem so etwas heute noch beigebracht wird, ich hoffe
nur, dass so etwas nicht an einer deutschen Hochschule passiert (wahrscheinlich ist das dann keine Eliteuni). Da nicht
zu erkennen ist, was der Algorithmus erreichen soll, mach es wenig Sinn diesen hier zu verbessern, denn irgendwann
müsste ja t ein Wert zugewiesen werden. Ich kann nicht erraten welcher, aber es geht garantiert ohne Goto und Label
viel besser.
Wahrscheinlich sollte der Algorithmus besser in ein Modul eingebaut werden. Näheres hierzu ist im Hilfesystem von MMA
zu finden.
Schöner Gruß
Peter Klamser
Christian M. Sperber wrote:
ich versuche in einer Label[beginn];.......;If[test,Goto[begin]] Schleife. einen Wert gegen den in der naechsten Runde
berechneten zu vergleichen. Ich bekomme es aber nicht hin diesen zu definieren. Mathematica akzeptiert das nicht. Damit
es klarer wird habe ich ein notebook angehaengt.
In der ersten Berechnung laeuft die Anzahl der Durchgaenge ueber eine Variable q. In der zweiten Berechung habe ich es
einfach so aufgeschrieben wie ich es gerne haette funktioniert aber nicht.