Kontrollstruktur unless?
-
LordJaxom schrieb:
#define unless(x) if(!(x))Pfui. Sowas unsicheres wie Makros verwenden nur um ein if( not xxx ) durch was eigenes zu ersetzen? Das ist nicht nur wegen der üblichen Makro-Issues bedenklich (wenn irgendwo eine Variable oder Typ unless erwähnt wird, dann ersetzt das Makro das völlig ungeniert etc.) sondern ich würds fast als moralisch verwerflich bezeichnen

-
until(x) über while(!x) zu definieren wäre falsch weil until und while logisch dieselbe aussage treffen, also beides sind synonyme
ein macro für unless zu machen kann unter umständen schon sinn machen wenn man es oft braucht da ifs mit anschließenden negationen für menschen allgemein schwer verständlich sind
"we disagreed not to agree on not going to the store" sehr einfacher satz eigentlich aber man braucht trotzdem nen bisschen um rauszufinden was eigentlich damit gemeint ist
allerdings würde ich trotzdem statt einem "unless" zu einem zusätzlichen boolean wert greifen der entsprechend benannt wird in solchen fällen, etwas wie
bool isRowEditable = !hasIllegalArgument | (loginRights & RIGHT_EDIT) | !(elementFocus | elementIdle) if(isRowEditable)...nicht das das jetzt irgendwie sinn machen würde (die art wie ich den boolean da definiert habe) aber würde das in dem if drin stehen könnte man das ebenfalls schmeißen, solche ausdrücke sind furchtbar im programmcode und sollten möglichst abstrahiert werden
ich mache sowas im grunde auch schon für ganz einfache dinge wie, aus der luft gegriffen
bool canJump = !highGravity;selbst so ein super einfacher ausdruck wie !highGravity bekommt gleich viel mehr information und verständlichkeit draufgepackt wenn man ihn für etwas konkretes benutzt (kann der charakter springen?) und dabei über einen extra boolean abstrahiert
also grundsätzlich spricht nichts gegen so ein unless macro (vllt eher einfach nur eines das eine negation vornimmt und nicht gleich ein if mit drin hat)
allerdings solltest du dir überlegen ob du nicht lieber mit booleans arbeiten möchtest da es eben "mehr native ist"
-
Vevusio schrieb:
until(x) über while(!x) zu definieren wäre falsch weil until und while logisch dieselbe aussage treffen, also beides sind synonyme
talk about... etwas ist für menschen allgemein schwer verständlich

"solange" (while) und "solange bis" (until) sind nicht wirklich synonyme, solange bis du mir folgen kannst
ein macro für unless zu machen kann unter umständen schon sinn machen wenn man es oft braucht da ifs mit anschließenden negationen für menschen allgemein schwer verständlich sind
und was ist damit:
Hauptprogramm: Standardausgabe soll "Hello World" anzeigen Stopdas ist doch wohl um einiges verständlicher als ein typisches hello-world programm, und braucht nur
#define Hauptprogramm int main () { start #define Standardausgabe std::cout #define soll << #define anzeigen << endl; #define Stop }wenn du C++ lernst, ist dir C++ verständlich. wenn du eine abfrage wie
if (canJump)siehst, weißt du sofort, was gemeint ist. auch
if (!highGravity)erklärt sich dir dann von selbst.
aber was
unless(highGravity)bedeuten soll, das weißt du als gelernter C++ler einfach nicht bevor du dich nicht durch unmengen an dokumentation durchgeschlagen hast - *und* ausschließt, dass es irgendwo eine variable gibt, die "unless" heißt *und* sicherstellst, dass das macro überall, wo es verwendet wird, auch definiert ist.
-
#define REPEAT do { #define UNTIL(x) } while (!(x)) #define IF(x) if (x) #define UNLESS(x) if (!(x)) #define THEN #define BEGIN { #define END } #define ASSIGN (x, y) x = (y) ASSIGN(x,3) REPEAT IF (x < 5) THEN BEGIN END UNTIL (x > 10)In der Hoffnung, daß ich so einen Code nie lesen muß

-
wo wäre dann der unterschied zwischen
while(couter < MAX) { counter++; } until(counter < MAX) { counter++; }natürlich heißt wort wörtlich until übersetzt "bis" und while "solange", ich hab nicht gesagt es ist dasselbe wort sondern es sind logische synonyme
außerdem hab ich gesagt das unless macro wäre nur dann gerechtfertigt wenn man es wirklich oft benutzen muss aus irgend einem grund in einem programmbereich
#define int main{...
#define ..was du geschrieben hast, wir müssen anscheinend eine andere auffassung von oft haben weil ich ein "int main(int argc...)" nicht sonderlich oft in einem programm drin stehen habe
if(highJump) versteht man nicht als gelehrter c++ programmierer, das versteht man als egalwas programmierer und auch als nicht programmierer
es ging nicht darum die syntax zu verstehen sondern die logik, es möglichst einfach zu machen über den code zu lesen
und
if(!highGravity) { //irgend ein jump code }muss nicht unter umständen verständlich sein, aber wenn man es auf if(canJump) runterbricht weiss man in dem if ist irgend eine jumping behandlung (ob da jetzt character.Jump() oder sonst was drinsteht was darauf auch hinweisen würde oder ein kommentar zusätzlich zu dem if, das ist wieder was anderes)
und auch wenn sich if(!highGravity) von selbst erklärt muss man kurz dort anhalten und "äh wenn gravity nicht true ist geht er in das if hinein. hm hm", es ist nichts weltbewegendes aber macht den code ein klein wenig schwerer lesbar
und spätestens bei
if(!noCollisionFound && !(highGravity || !staminaNotEmpty))
so nen ausdruck wenn man keine eindeutigen hinweise hat worauf man abfragt eigentlich zu knacken ist richtig scheiße, auch wenn er sich natürlich "von selbst erklärt", ist ja einfache aussagenlogik, aber trotzdem wäre eine hilfsvariable nötig
-
Vevusio schrieb:
wo wäre dann der unterschied zwischen
while(couter < MAX) { counter++; } until(counter < MAX) { counter++; }Die until Variante läuft, bis die Bedingung erreicht wird (bis counter < MAX), also in Deinem Beispiel wird die Schleife gar nicht durchlaufen, sofern die Initialwert < MAX war.
Die while-Variante läuft, solange die Bedingung erfüllt ist, terminiert also erst, wenn counter >= MAX wird.PS:
Makros zu erstellen um Befehle einer Programmiersprache umzubiegen ist das allerletzte. Die Syntax einer Programmiersprache ist begrenzt und im Falle von C/C++ standardisiert, und das aus gutem Grund.
Redundante Befehle einzuführen, die sich einem mit der Sprache vertrauten Programmierer nicht erschließen ist absolut der falsche Weg. Und wer mit der Sprache nicht vertraut ist, wird es auch mit Pseudo-Konstrukten schwer haben. Das einzige, was man damit erreicht, ist, dass der Code für beide Seiten unverständlich wird.
Es gibt eine Regel:
So komplex wie nötig aber so einfach wie möglich.
Und das bedeutet: Keine redundanten Befehle, schon gar nicht, wenn sie über Makros in die Sprache reingefrickelt werden müssen. C++ Programme sind aus Unkenntnis oder Dummheit vieler Programmierer eh schon schlimm genug (es gibt viele, die meinen, etwas C in Klassen gefüllt wäre gutes C++).
Mal ganz davon abgesehen, dass die Makroexpansion bei allen Dingen die Seiteneffekte haben, katastrophale Folgen haben kann.
Und ja, ich rege mich auf und steigere mich rein. Solche Ergüsse sind ja wohl das Letzte. Wer meint, eine Programmiersprache mit den "guten eigenen Befehlen" erweitern zu müssen, der sollte es lieber sein lassen, also das Programmieren, meine ich.
Wer bestimmt Konstrukte, die eine Sprache nicht bietet, benötigt, der sollte sich nach einer anderen Sprache umsehen, wo diese Konstrukte zur Verfügung gestellt werden. Ada oder Pascal vielleicht.
-
Vevusio schrieb:
natürlich heißt wort wörtlich until übersetzt "bis" und while "solange", ich hab nicht gesagt es ist dasselbe wort sondern es sind logische synonyme
Wenn Du der Meinung bist, dann machst Du sicher bei folgendem Spiel mit:
Du überweist mir jeden Monat 100 EUR, solange ich lebe. Ich überweise Dir auch jeden Monat 100 EUR, bis Du lebst.
-
Vevusio schrieb:
selbst so ein super einfacher ausdruck wie !highGravity bekommt gleich viel mehr information und verständlichkeit draufgepackt wenn man ihn für etwas konkretes benutzt (kann der charakter springen?) und dabei über einen extra boolean abstrahiert
*zustimm*
Aber generell hat doch niemand gesagt, dass er "until" oder "unless" ernsthaft benutzen will, oder? Und empfohlen wurde es imho auch nicht, ich verstehe die Aufregung darum nicht..
-
Badestrand schrieb:
Aber generell hat doch niemand gesagt, dass er "until" oder "unless" ernsthaft benutzen will, oder? Und empfohlen wurde es imho auch nicht, ich verstehe die Aufregung darum nicht..
Der einzige Grund warum man
unlessnicht uneingeschränkt empfehlen kann ist, dass C/C++'s Makrosystem so für die Tonne ist das manunlessnicht implementieren kann:<condition> := break_it(with, commas)Leute die mit
unlessnicht klar kommen oder kategorisch gegen jeden Einsatz von Makros sind, sollten sich mal fragen wer hier zu dumm für irgendetwas ist...
-
'f schrieb:
Badestrand schrieb:
Aber generell hat doch niemand gesagt, dass er "until" oder "unless" ernsthaft benutzen will, oder? Und empfohlen wurde es imho auch nicht, ich verstehe die Aufregung darum nicht..
Der einzige Grund warum man
unlessnicht uneingeschränkt empfehlen kann ist, dass C/C++'s Makrosystem so für die Tonne ist das manunlessnicht implementieren kann:<condition> := break_it(with, commas)Leute die mit
unlessnicht klar kommen oder kategorisch gegen jeden Einsatz von Makros sind, sollten sich mal fragen wer hier zu dumm für irgendetwas ist...Es gibt genügend Gründe dafür, dass in Sprachen, in denen es um hohe Betriebssicherheit der Software geht, komplett auf einen Präprozessor verzichtet wird. Ada ist hier wohl das beste Beispiel. Und in C++ wurden Templates und inline Funktionen bestimmt auch nur so aus Spaß eingeführt.
Man man man, wenn ihr Euch eine eigene Programmiersprache bauen wollt, dann macht das von Grund auf, aber missbraucht nicht den C-Präprozessor dafür.
-
Tachyon schrieb:
Es gibt genügend Gründe dafür, dass ist Sprachen, in denen es um hohe Betriebssicherheit der Software geht, komplett auf einen Präprozessor verzichtet wird.
Haha, hast du gerade C++ mit hoher Betriebssicherheit in Verbindung gebracht?

Tachyon schrieb:
Und in C++ wurden Templates und inline Funktionen bestimmt auch nur so aus Spaß eingeführt.
Templates und inline Funktionen decken alle Einsatzmöglichkeiten von Makros ab?
Tachyon schrieb:
Man man man, wenn ihr Euch eine eigene Programmiersprache bauen wollt, dann macht das von Grund auf, aber missbraucht nicht den C-Präprozessor dafür.
Inwieweit unterscheidet sich
unlessdenn von selber definierten Funktionen, Typen, etc.?Btw, was wäre denn deiner Meinung nach kein Missbrauch des CPP?
-
'f schrieb:
Btw, was wäre denn deiner Meinung nach kein Missbrauch des CPP?
selber definierte Funktionen, Typen, etc. Denn diese sind Sprachmittel und keine Präprozessor-Makros.
-
Ich weiss nicht, obs schon gesagt wurde:
Benutz so ein Konstrukt nicht um dir "deine" Programmiersprache zu basteln...Das ganze extrem wird unleserlich.
Und den ganzen Makro Kram auch nur verwenden, wenn es nicht anders geht.
-
'f schrieb:
Tachyon schrieb:
Es gibt genügend Gründe dafür, dass ist Sprachen, in denen es um hohe Betriebssicherheit der Software geht, komplett auf einen Präprozessor verzichtet wird.
Haha, hast du gerade C++ mit hoher Betriebssicherheit in Verbindung gebracht?

Ich sagte, solche Sprachen verzeichten komplett auf einen Präprozessor und führte Ada an. Verzichtet C++ auf einen Präprozessor? Ich denke nicht. Lesen hilft verstehen.
'f schrieb:
Tachyon schrieb:
Und in C++ wurden Templates und inline Funktionen bestimmt auch nur so aus Spaß eingeführt.
Templates und inline Funktionen decken alle Einsatzmöglichkeiten von Makros ab?
Unter C++ leider nicht, da z.B. Interfaces nicht über einen entsprechenden Mechanismus eingefügt werden, sondern durch textuelle Ersetzung (#include).
Es ging aber auch nicht um alle Einsatzmöglichkeiten, sondern um das völlig überflüssige definieren von redundanten pseudo Schlüsselwörtern.'f schrieb:
Tachyon schrieb:
Man man man, wenn ihr Euch eine eigene Programmiersprache bauen wollt, dann macht das von Grund auf, aber missbraucht nicht den C-Präprozessor dafür.
Inwieweit unterscheidet sich
unlessdenn von selber definierten Funktionen, Typen, etc.?Btw, was wäre denn deiner Meinung nach kein Missbrauch des CPP?
Dir ist offensichtlich nichtmal der Unterschied zwischen Daten, Funktionen und Kontrollstrukturen bewusst.
Unless wäre eine selbst definierte Kontrollstruktur, die mit textueller Ersetzung etwas nachbildet, dass sich ohne weiteres auch mit if direkt im Code, verständlich für jeden der die Sprache kennt, implementieren lässt.
Man kann hier natürlich gerne als unregistrierter Unwissender auf irgendwelchen Leuten rumbashen, aber vielleicht solltest Du mal ein paar Bücher z.B. von Bjarne Stroustrup oder Scott Meyers lesen, bevor Du hier mit Deiner grandiosen Unwissenheit glänzt. Das Nachbilden von Kontrollstrukturen kommt in der Regel von irgendwelchen Leuten, die von einer anderen Programmiersprache her kommen, und meinen ein bestimmtes Schlüsselwort (aus der alten Sprache) wäre unbedingt erforderlich (in der Regel um irgendwelchen Code 1:1 portieren zu können) anstatt sich mit der Sprache auseinanderzusetzen und etwas vernünftiges zu generieren. Solche Leute sind leider hoffnungslose Anachronisten.
-
'f schrieb:
Haha, hast du gerade C++ mit hoher Betriebssicherheit in Verbindung gebracht?

Sauber geschriebener C++ Code hat auch eine hohe Betriebssicherheit. Und schlecht geschriebene Software mag von der ein oder anderen Sprache etwas abgefangen werden, wenn ich mir aber z.B. die Abstürze diverser Anwendungen ansehe hat Betriebssicherheit nichts, aber auch garnichts mit der Sprache zu tun (ob nun C++, VB, C#, Java, ...).
Ich hoffe dir ist überhaupt bewusst wieviel Software in C++ geschrieben wurden ist (und wie alltäglich man mit dieser in Einsatz kommt).
'f schrieb:
Templates und inline Funktionen decken alle Einsatzmöglichkeiten von Makros ab?
Nein, aber fast alle sinnvollen.
'f schrieb:
Inwieweit unterscheidet sich
unlessdenn von selber definierten Funktionen, Typen, etc.?Ich würde sagen es macht grundsätzlich keinen Sinn in einer Sprache weitere Befehle mit Makros nachzubauen, da man den Code schlechter lesbar macht. Manche mögen "unless" als sinnvoll erachten, ich halte es eher für "useless", da man effektiv wie bei der Ungarischen Notation eine neue Sprache lernen muss.
Und der Vergleich mit Funktionen, eigenen Typen und Makros ist hinfällig: Makros sind kein direktes Sprachmittel und werden nicht so unterstützt wie ersteres. Mit eigenen Funktionen und eigenen Typen schafft man nicht noch nette Nebeneffekte wie das gerne von mir angeführte max-Makro (z.B. in windows.h) wenn man nichttriviale und auswertbare ausdrücke diesem Makro übergibt.
'f schrieb:
Btw, was wäre denn deiner Meinung nach kein Missbrauch des CPP?
Verwendung der C++ Sprachmittel, Vermeidung des Präprozessor wo er nicht (wie bei Include) unbedingt notwendig ist.
cu André
P.S: @Tachyon war keine Absicht
-
asc schrieb:
Tachyon schrieb
Puh, ich habe das nicht geschrieben. Bitte ändern.
-
Tachyon schrieb:
Ich sagte, solche Sprachen verzeichten komplett auf einen Präprozessor und führte Ada an. Verzichtet C++ auf einen Präprozessor? Ich denke nicht. Lesen hilft verstehen.
Dann solltest du vielleicht mal die Relevanz deines Einschubs erklären. Oder willst du auch Pointer, Arrays, praktisch alles was sich in C++ finden lässt verbieten weil man damit Schindluder treiben kann?
Tachyon schrieb:
Unter C++ leider nicht, da z.B. Interfaces nicht über einen entsprechenden Mechanismus eingefügt werden, sondern durch textuelle Ersetzung (#include).
Tja, dann muss man wohl auf solche Hacks verzichten und einfach alles in eine Quellcodedatei packen, hm?

Tachyon schrieb:
Es ging aber auch nicht um alle Einsatzmöglichkeiten, sondern um das völlig überflüssige definieren von redundanten pseudo Schlüsselwörtern.
Es ging auch um Makros allgemein. Und was meinst du denn mit "redundanten pseudo Schlüsselwörtern"?
Wenn du meinst dass
unlessredundant ist, sollten wir dann nichtwhile[c] und [c]do ... whilemeiden und uns komplett aufforkonzentrieren? Oder besser noch alles mitifundgotoregeln?Tachyon schrieb:
Dir ist offensichtlich nichtmal der Unterschied zwischen Daten, Funktionen und Kontrollstrukturen bewusst.
Wer im Glashaus sitzt, sollte Typen nicht mit Daten gleichsetzen.
Tachyon schrieb:
Unless wäre eine selbst definierte Kontrollstruktur, die mit textueller Ersetzung etwas nachbildet, dass sich ohne weiteres auch mit if direkt im Code, verständlich für jeden der die Sprache kennt, implementieren lässt.
Selbst definierte Datentypen, Funktionen, Templates, etc., lassen sich auch direkt im Code, verständlich für jeden der die Sprache kennt, implementieren. Und nun?
Tachyon schrieb:
Man kann hier natürlich gerne als unregistrierter Unwissender auf irgendwelchen Leuten rumbashen, aber vielleicht solltest Du mal ein paar Bücher z.B. von Bjarne Stroustrup oder Scott Meyers lesen, bevor Du hier mit Deiner grandiosen Unwissenheit glänzt. Das Nachbilden von Kontrollstrukturen kommt in der Regel von irgendwelchen Leuten, die von einer anderen Programmiersprache her kommen, und meinen ein bestimmtes Schlüsselwort (aus der alten Sprache) wäre unbedingt erforderlich (in der Regel um irgendwelchen Code 1:1 portieren zu können) anstatt sich mit der Sprache auseinanderzusetzen und etwas vernünftiges zu generieren. Solche Leute sind leider hoffnungslose Anachronisten.
Ich kann mich auch gerne einloggen wenn dich das glücklich macht

Deine Theorie ist im übrigen komplett falsch, allerdings, genau wie der Umstand dass du mir Unwissenheit vorwirfst, scheinbar allein weil du anderer Meinung bist, Zeugnis deiner beschränkten Vorstellungskraft und Verbohrtheit.
-
Gut, dass Du mit Deinen Meinungen hier alleine bist.
Ich hoffe übrigens, dass, falls Du überhaupt schon alt genug bist um zu Arbeiten, Dein Code Dir vor irgendwelchen Reviews oder Code Quality Checks um die Ohren fliegt. Sonst bist Du schneller wieder draußen als Dir lieb ist (oder die Firma ist ihren Namen nicht Wert).
Und noch eine ganz unbedarfte Frage hinterher:
Was meinst Du, soll jemand der Deinen Code liest denken was hier passiert?
unless(boolscher_wert) { //zeugs }Rufst Du eine Funktion auf die einen boolschen Wert als Argument erwartet und öffnest anschließend einen neuen Scope? Oder ist es doch ein Makro? Und wann ja, was tut das Makro? Oh, da muss man erstmal nachsehen.
Ist natürlich viel einleuchtender alsif(!boolscher_wert) { //zeugs }wo sofort jedem ohne rumsuchen klar wird, dass hier etwas passieren soll, wenn der boolsche Ausdruck falsch ist.
}
-
'f schrieb:
Dann solltest du vielleicht mal die Relevanz deines Einschubs erklären. Oder willst du auch Pointer, Arrays, praktisch alles was sich in C++ finden lässt verbieten weil man damit Schindluder treiben kann
?
Es geht hier gerade ausschließlich um den Präprozessor. Kennst Du überhaupt den Unterschied zwischen Präprozessor und Compiler?
-
asc schrieb:
Sauber geschriebener C++ Code hat auch eine hohe Betriebssicherheit.
Ja, durchaus. Allerdings nicht einmal annähernd so sicher wie viele andere Sprachen, inklusive und insbesondere Ada.
Und die Verwendung von Makros ist in C++ nicht prinzipiell unsicher, genauso wenig wie eigene Kontrollstrukturen (in Sprachen welche vernünftige Möglichkeiten dazu bieten).
asc schrieb:
'f schrieb:
Templates und inline Funktionen decken alle Einsatzmöglichkeiten von Makros ab?
Nein, aber fast alle sinnvollen.
asc schrieb:
Ich würde sagen es macht grundsätzlich keinen Sinn in einer Sprache weitere Befehle mit Makros nachzubauen, da man den Code schlechter lesbar macht. Manche mögen "unless" als sinnvoll erachten, ich halte es eher für "useless", da man effektiv wie bei der Ungarischen Notation eine neue Sprache lernen muss.
Und der Vergleich mit Funktionen, eigenen Typen und Makros ist hinfällig:
Nein, er ist keineswegs hinfällig: "Manche mögen Bibliotheken dritter als sinnvoll erachten, ich halte es eher für 'useless', da man effektiv wie bei der Ungarischen Notation eine neue Sprache lernen muss."
asc schrieb:
'f schrieb:
Btw, was wäre denn deiner Meinung nach kein Missbrauch des CPP?
Verwendung der C++ Sprachmittel, Vermeidung des Präprozessor wo er nicht (wie bei Include) unbedingt notwendig ist.
CPP = C preprocessor