Hypotetisches inline-switch case

Status
Nicht offen für weitere Antworten.
B

Beni

Gast
Ich bin dabei, eine Scriptsprache zu schreiben, die einen Syntax ähnlich wie Java hat.

In Java gibt es ja den ?-Operator, mit dem man ein if inlinen kann:
Code:
int x = condition ? valueTrue : valueFalse;

Ich frage mich, wie könnte sowas für switch aussehen?

Erste Ansätze wie...
Code:
int x = aString ! "a" : 1, "b" : 2, defaultValue
... sehen zwar hübsch aus, haben aber Probleme: das ! ist schon belegt (boolsche Negation), und das Ding kann man wegen den ',' nur schwer als Argument einer Methode benutzen.

Hat jemand eine gute Idee wie der Syntax aussehen könnte?
 

Illuvatar

Top Contributor
Code:
int x = aString switch(is? case?) "a" : 1 or "b" : 2 or(else? default?) defaultValue;

Mal paar Vorschläge zusammengefasst ;)
 
B

Beni

Gast
Danke, so könnte man es wirklich umsetzen.

Schlüsselwörter wollte ich möglichst vermeiden (der Schreibaufwand...), also wenn ihr noch andere Ideen habt, nur heraus damit :wink:
 

Lim_Dul

Top Contributor
Anstelle von "is" einfach ?? nehmen. Würde mir jetzt in den Sinn kommen, da ja ? eine einfache Verzweigung ist und ?? dann halt eine komplexe ;)
 
B

Beni

Gast
Lim_Dul :shock: ???:L :### :arrow: :applaus:

[Edit]
Der senkrechte Strich ("or" von Illu :wink:) ist noch unbenutzt. Damit kann ich sowas basteln:
Code:
int x = aString ?? "a" : 1 | "b" : 2 | defaultValue

Hmja, ich glaub so mach ich das.

Danke an alle Mitdenker.
 
B

Beni

Gast
Ja, ein einzelnes ? kommt nicht in Frage, das gäbe totale Verwirrung.

Das mit den Schlüsselwörtern bezog sich vorallem auf das "switch case or else default...", zwei Zeichen machen keine Probleme.

"??" gefällt mir besser als "is", zum einen ist es kein Wort, zum anderen bleibt dann "is" frei als Variablennamen, und drittens finde ich die Idee "da ja ? eine einfache Verzweigung ist und ?? dann halt eine komplexe" sehr ansprechend.

P.S. Tastaturlayouts kann man umschalten, wer D benutzt, ist selbst schuld :wink:
 
B

Beni

Gast
Nicht auf die Tastatur schauen! Ich musste das auch erst lernen, aber nach ein oder zwei Wochen ist alles ganz natürlich. Und ein ; mit dem kleinen Finger schreiben, ist schon herrlich :bae:
 
R

Roar

Gast
Wildcard hat gesagt.:
Roar hat gesagt.:
ich wär für ? statt ?? ???:L
Das braucht er ja schon für den ternären Operator
schon aber is doch kein problem eigentlich mit nem parser zu prüfen ob hinter nem ? die syntax für ne switch oder normale if else anweisung kommt.
also ich wäre eher davon verwirrt dass es nun zwei operatoren "?" und "??" gibt, schileßlich machen beide ja fast das gleiche ;)
 

Hilefoks

Bekanntes Mitglied
Mir persönlich gefallen alle bisher gemachten Vorschläge, auch nach stundenlanger Betrachtung, nicht sonderlich. :oops:

Ich "liebe" den ternären Operator als solches. In Java geht er mir allerdings nicht weit genug, in Python ist er sehr häßlich. Ein ternärer Operator der Form bool?ifTrue:ifFalse; ist aber wirklich etwas schönes! Mit ihm lassen sich dann auch recht einfache switch-case Konstrukte einfach realisieren:
Code:
i==3?do3():i==2?do2():i==1?do1():i==0?do0():doElse();

Alternativ könnte ich mir soetwas wie dies vorstellen
Code:
// Wobei liste iteratable sein muss
i in liste?case_a:case_b:case_c else case_else;

// also z.B.
i in [3,2,1] ? do3() : do2() : do1() else doElse();
Diese Idee halte ich allerdings für viel zu unleserlich und komplex. Daher würde ich es bei einem einfachen aber flexiblen ternären Operator belassen...

MfG,
Hilefoks
 
B

Beni

Gast
Naja, mehrere if-elses... das funktioniert weil du eine Variable "i" genommen hast, wenn es etwas komplizierteres ist, gibt das viel Wiederholungen zu schreiben.

Und zuerst alle Bedingungen, danach der Code gefällt mir nicht. Da ist die "Ursache" zuweit vom "Effekt" entfernt.
 

DEvent

Bekanntes Mitglied
Beni hat gesagt.:
Naja, mehrere if-elses... das funktioniert weil du eine Variable "i" genommen hast, wenn es etwas komplizierteres ist, gibt das viel Wiederholungen zu schreiben.

Und zuerst alle Bedingungen, danach der Code gefällt mir nicht. Da ist die "Ursache" zuweit vom "Effekt" entfernt.

Code:
i==3?do3():i==2?do2():i==1?do1():i==0?do0():doElse();
Das gefällt mir. Wenn man etwas kompliziertes hat, dann nimmt man die switch-Verzweigung. Bei einer komplizierten blub() ? /* hier viel Code*/ : /*noch viel Code*/ nimmt ja auch eine if-else Verzweigung.

btw, was ist eigentlich der Hintergrund zu dem Thread?
 
B

Beni

Gast
DEvent hat gesagt.:
Code:
i==3?do3():i==2?do2():i==1?do1():i==0?do0():doElse();
Naja, an dieser Variante hindere ich niemanden. Das Switch-Case habe ich unterdessen mit ! und | realisiert, dass sieht dann so aus:
Code:
// einzeilig
int wert = einString ! "0" : 0 | "1" : 1 | "2" : 2 | -1

// mehrzeilig
string info = (a + b + c) !
  | 0 : "das ist Null"
  | 1 : "das ist Eins"
  | 2 : "das ist Zwei"
  | "Das sind viele"

btw, was ist eigentlich der Hintergrund zu dem Thread?
Ich schreibe an einem kleinen Programm das komplizierte Regelwerke verarbeiten soll, um mir die Arbeit zu erleichtern (und auch aus Spass....) habe ich eine Scriptsprache geschrieben, um die Regelwerke darzustellen. Und dieser Thread war dazu da, mich inspirieren zu lassen (was auch geklappt hat) :wink:
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben