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.
User avatar
DonLucio
Posts: 466
Joined: Sun 29. Dec 2013, 01:14
Location: Hamburg

Rexx: Alle sind gleich, aber manche sind gleicher?

Post by DonLucio » Mon 3. Mar 2014, 12:06

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: Select all

/* 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
Posts: 20
Joined: Mon 6. Jan 2014, 12:00

Post by dargndorp » Mon 3. Mar 2014, 12:19

Regina Rexx macht's genauso. Scheint kein Bug, sondern ein Feature zu sein.

User avatar
wilfried
Posts: 656
Joined: Mon 23. Dec 2013, 18:26
Location: Barsinghausen

Post by wilfried » Mon 3. Mar 2014, 13:28

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. ;-)

User avatar
DonLucio
Posts: 466
Joined: Sun 29. Dec 2013, 01:14
Location: Hamburg

Post by DonLucio » Mon 3. Mar 2014, 15:13

wilfried wrote: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.

User avatar
LotharS
Posts: 691
Joined: Sun 29. Dec 2013, 20:07
Location: Düsseldorf

Post by LotharS » Mon 3. Mar 2014, 23:10

DonLucio wrote: 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