Hi,
sieht sehr gut aus jetzt!
Ich habe noch einmal Dutzende Varianten meiner Testcodes durchgespielt, und alles funktioniert perfekt!
Ich denke also, wir könnten uns allmählich daran machen, die finale und vollständige Definition der "If-Regeln" zu formulieren. Wenn ich das richtig sehe, dann sind die:
1. Einzeiler immer ohne "endif"
2. Bei Mehrzeilern: "if..then", "else" (falls vorhanden) und "endif" immer jeweils *alleine* in einer Zeile
3. Max. Verschachtelungstiefe = 4
Stimmt ihr dem zu?
Ich habe zwei Anmerkungen / Fragen zu den obigen Regeln:
zu 2: Hier ist von den Usern insb. ernst zu nehmen, dass auch "else" alleine stehen muss. Wenn es das nicht tut, gibt es nämlich (im Gegensatz zu wenn "if..then" nicht alleine steht) *keinen* parse error, aber falsch laufenden Code! Beispiel hänge ich ganz unten an diese Message an.
zu 3: Gibt es eigentlich einen tiefen/guten Grund, dass diese Zahl so niedrig ist? Mir ist schon klar, dass die Stacktiefe nicht beliebig groß sein kann. Aber 4 ist doch schon sehr klein. Wäre es nicht zu überlegen, ob man bei dieser Gelegenheit das nicht zumindest auf 10 oder so erweitern sollte?
(Habe übrigens mal geprüft, ob es die selbe Grenze beim "gosub..return" Stack gibt. Dem ist aber nicht so. Habe bis zu einer Verschachtelungstiefe von 6 manuell getestet, und das läuft ohne Probleme. Wenn hier das Stacklimit kein Problem ist, warum dann bei "if"? Oder lässt sich das gar nicht so vergleichen?)
Dies ist aber natürlich nicht soo wichtig...
Noch ein Kommentar/Frage zu folgendem:
Wenn das jetzt im Build geändert wird, da werden auf einmal massenweise Skripte zunächst mal nicht mehr funktionieren!
Das sehe ich eigentlich gar nicht. Ich würde eher folgendes annehmen: Code, der mit der rudi-Version anders läuft als vorher, war schon
vorher defekt. Mit "defekt" meine ich hier, dass solcher Code (u.U. natürlich abhängig vom aktuellen Inhalt der benutzten Vergleichsvariablen) in der alten uBasic-Version entweder parse errors oder falsche Verzweigungen erzeugt. Oder sehe ich das verkehrt?
Zum Schluss noch ein anderer kleiner "Fund" (hat jetzt mit dem "if" gar nix zu tun):
Ich habe schon gesehen, dass sich mancher gefragt hat, was denn die Limitierungen der Namensgebung von Labels sind (wie lang sie sein dürfen usw.). War erstaunt, folgendes zu finden:
(a) Es sind auch numerische Zeichen und Underscore erlaubt, also z.B. 'gosub "Switch_ON"' und 'gosub "case1"' usw. Das ist sicher manchmal nützlich, Code lesbarer zu machen.
(b) Labels können sogar rein numerisch sein, d.h. müssen nicht mit einem Buchstaben anfangen, also z.B. 'gosub "123"' ist OK.
(c) Habe bis zu Label-Längen von 40 Zeichen erfolgreich getestet! (Macht den Code wahrsch. nicht gerade schneller.)
Hier das Beispiel, wo "else" nicht alleine steht:
- Code: Alles auswählen
size: 256, read: 256
Program:
rem Testing IF constructs
@title TestIF06
a=0
b=0
gosub "tryif"
a=0
b=1
gosub "tryif"
a=1
b=0
gosub "tryif"
a=1
b=1
gosub "tryif"
end
:tryif
print ""
print "case", a, b
if a then
print "if a"
else print "a else"
endif
return
=====================================
[]
[case 0 0]
[a else]
[]
[case 0 1]
[a else]
[]
[case 1 0]
[if a]
[a else]
[]
[case 1 1]
[if a]
[a else]