# Hypotetisches inline-switch case



## Beni (16. Jan 2007)

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:

```
int x = condition ? valueTrue : valueFalse;
```

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

Erste Ansätze wie...

```
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?


----------



## Wildcard (16. Jan 2007)

```
int x = aString is "a" : 1, "b" : 2, defaultValue
```
?


----------



## Illuvatar (16. Jan 2007)

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

Mal paar Vorschläge zusammengefasst


----------



## Beni (16. Jan 2007)

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:


----------



## Illuvatar (16. Jan 2007)

Ich hab hier noch nen paar Zeichen, wo du auswählen kannst:
http://www.unicode.org/charts/ :bae:


----------



## Lim_Dul (16. Jan 2007)

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


----------



## Beni (16. Jan 2007)

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

[Edit]
Der senkrechte Strich ("or" von Illu :wink ist noch unbenutzt. Damit kann ich sowas basteln:

```
int x = aString ?? "a" : 1 | "b" : 2 | defaultValue
```

Hmja, ich glaub so mach ich das.

Danke an alle Mitdenker.


----------



## Illuvatar (16. Jan 2007)

"??" ist weniger Schreibaufwand als "is"?


----------



## Wildcard (16. Jan 2007)

Illuvatar hat gesagt.:
			
		

> "??" ist weniger Schreibaufwand als "is"?


Vor allem mit der coding-freundlichen deutschen Tastatur  :?


----------



## Roar (16. Jan 2007)

ich wär für ? statt ?? ???:L


----------



## Wildcard (16. Jan 2007)

Roar hat gesagt.:
			
		

> ich wär für ? statt ?? ???:L


Das braucht er ja schon für den ternären Operator


----------



## Beni (16. Jan 2007)

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:


----------



## Wildcard (16. Jan 2007)

Beni hat gesagt.:
			
		

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


Ich bin ein Kleingeist. 
Unterschiedliche Beschriftung und Belegung makes baby Jesus cry  :cry:


----------



## Beni (16. Jan 2007)

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:


----------



## Roar (16. Jan 2007)

Wildcard hat gesagt.:
			
		

> Roar hat gesagt.:
> 
> 
> 
> ...


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


----------



## Wildcard (16. Jan 2007)

neeee, lass mal. Ich hab auch so schon genug mit dem Microsoft Natural Keyboard zu kämpfen  :?


----------



## Hilefoks (16. Jan 2007)

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

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:
	
	
	
	





```
i==3?do3():i==2?do2():i==1?do1():i==0?do0():doElse();
```

Alternativ könnte ich mir soetwas wie dies vorstellen
	
	
	
	





```
// 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


----------



## Beni (17. Jan 2007)

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 (11. Feb 2007)

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.




```
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?


----------



## masta // thomas (11. Feb 2007)

DEvent: ersten post gelesen?


----------



## Beni (11. Feb 2007)

DEvent hat gesagt.:
			
		

> ```
> 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:

```
// 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:


----------



## DEvent (11. Feb 2007)

masta // thomas hat gesagt.:
			
		

> DEvent: ersten post gelesen?


Hab den ersten Satzt überlesen :bae:


----------

