Rexx: Alle sind gleich, aber manche sind gleicher?

(DE) Anwendungen für Office, Multimedia und Spiele, Werkzeuge, Hilfsprogramme, etc
(EN) Applications for Office, Multimedia or Games, Tools, Utilities, e.g.
Antworten
Benutzeravatar
DonLucio
Beiträge: 950
Registriert: So 29. Dez 2013, 01:14
Wohnort: Hamburg
Kontaktdaten:

Rexx: Alle sind gleich, aber manche sind gleicher?

Beitrag von DonLucio »

Mal vorweg: Bin ich hier mit einem Prorgammier-Thema im richtigen Forum?

Also:
Ich bin leidenschaftlicher Rexx-Programmierer, seit Jahrzehnten. Nun frage ich mich allerdings: Hat meine Rexx.dll einen Hau oder hab ich grundlegende Dinge nicht verstanden? Seit Tagen suchte ich einen Fehler in einem größeren Programm und bin nach verzweifeltem Suchen an allen möglichen falschen Stellen nun fündig geworden.

Es geht um den "Gleich"-Operator. Beispiel:

Code: Alles auswählen

/* rexx */
Hallo1 = "20"x || "Hallo";  /* "20"x steht für "Blank" (Leerzeichen)  */
Hallo2 =  "Hallo";

if Hallo1 = Hallo2 then say "Das ist ja'n Ding!";
/* ende --------- */
Aus anderen Programmiersprachen kenne ich den "=="-Operator, und der hilft auch hier die gewünschte Ungleichheit herzustellen. Insofern hab ich meinen Bug beseitigen können. Ich würde aber gern wissen: Welcher Sinn steckt hinter der Interpretation von "Gleichheit" zweier Strings, die nach "menschlichem" Ermessen alles andere als gleich sind?

Man kann auch nicht sagen: "Jede Art von Whitespace wird ignoriert", das könnte ich noch verstehen. So ist es aber auch nicht. Das obige Beispiel auf "00"x modifiziert führt sehr wohl zur (erwarteten) Ungleichheit. Warum wird ausgerechnet der durchaus signifikante Character "Space" in der Auswertung weggebügelt?

Oder doch ein Bug in meiner Rexx-Umgebung? Immerhin kann ich in der Rexx-Dokumentation weder einen Hinweis auf "==" noch auf diese spezielle Art der "Gleichheits"-Bedingung finden. Fahre eCS 2.1 GA.

Gruß
Don Lucio
dargndorp
Beiträge: 20
Registriert: Mo 6. Jan 2014, 12:00

Beitrag von dargndorp »

Regina Rexx macht's genauso. Scheint kein Bug, sondern ein Feature zu sein.
Benutzeravatar
wilfried
Beiträge: 667
Registriert: Mo 23. Dez 2013, 18:26
Wohnort: Barsinghausen
Kontaktdaten:

Beitrag von wilfried »

Hier ein Zitat aus einem IBM-REXX-Reference für den einfachen Vergleich (=):
Otherwise, both terms are treated as character strings (leading and trailing blanks are ignored, and then the shorter string is padded with blanks on the right).
Auf Deutsch heisst das ungefähr: Andernfalls werden beide Ausdrücke als Zeichenketten behandelt (führende und folgende Leerzeichen werden ignoriert und dann die kürzere Zeichenkette rechts mit Leerzeichen aufgefüllt.
Der Text vor "Andernfalls" bezieht sich auf den numerischen Vergleich.
Es ist alles ok und das war schon immer so. ;-)
Benutzeravatar
DonLucio
Beiträge: 950
Registriert: So 29. Dez 2013, 01:14
Wohnort: Hamburg
Kontaktdaten:

Beitrag von DonLucio »

wilfried hat geschrieben:Hier ein Zitat aus einem IBM-REXX-Reference für den einfachen Vergleich (=):
Otherwise, both terms are treated as character strings (leading and trailing blanks are ignored, and then the shorter string is padded with blanks on the right)."
Hallo Wilfried,

das ist interessant. In der deutschen Version der Rexx-Reference (Rexx.inf) steht das so:
"Handelt es sich bei den zu vergleichenden Werten nicht um Zahlen, so werden vom Interpreter Zeichen verglichen. Bei den beiden Wörtern (Zeichenketten) verkauf und vertrieb ergibt sich beispielsweise bei einem Vergleich auf Zeichenebene, daß die ersten drei Zeichen gleich sind."

Kein Wort davon, dass da zuerst allerlei Wegstrippen und dann Auffüllen gemacht wird.

Es bestätigt sich also die überholt geglaubte Regel: Bei Dokumentation immer auf das (englische) Original zurückgreifen.
Es ist alles ok und das war schon immer so. ;-)
OK, ich weiß jetzt, dass es so sein soll. Aber ich find dies Verhalten ziemlich hirnrissig. In keiner der mir bekannten Sprachen (Cobol, PL/1, C, PHP) ist das so.

Danke für die Aufklärung,
Don Lucio.
Benutzeravatar
LotharS
Beiträge: 968
Registriert: So 29. Dez 2013, 20:07
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von LotharS »

DonLucio hat geschrieben: Aber ich find dies Verhalten ziemlich hirnrissig. In keiner der mir bekannten Sprachen (Cobol, PL/1, C, PHP) ist das so.
Weil "höhere Programmiersprachen" (wie C, Cobol, PL/I, Pascal, Java) mit genau definierten Daten-Ausdrücken arbeiten, fallen Vergleichsoperationen automatisch präziser aus, obwohl mal mit '=', mal mit '==' zu schreiben. Scriptsprachen (wie Rexx, PHP, Basic) sind da bewusst salopper, und das scheint sich in deren Haupt-Anwendungsgebiet - Behandlung von Zeichenketten - recht gut zu bewähren, ohne sich erst lange mit Typ- und Formatgenauigkeit herumplagen zu müssen.

Es ist nun mal so, dass jede Programmiersprache ihre eigene Syntax hat; manches ist zum Verwechseln ähnlich und an anderen Stellen fällt man ständig herein weil man's von einer anderen Sprache her zu wissen meint. Ob es einem gefällt oder nicht: die Hoheit über die Syntax hat die jeweilige Sprache und nicht deren Anwender :P

Manchmal müssen selbst alte Hasen noch dazulernen, warum sollte das alleine mir passieren. :D
Antworten