Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

entweder ..., oder operator #72

Merged
merged 6 commits into from
Jun 15, 2024
Merged

entweder ..., oder operator #72

merged 6 commits into from
Jun 15, 2024

Conversation

NotLe0n
Copy link
Member

@NotLe0n NotLe0n commented Jun 15, 2024

Warum?

Um eine entweder ... oder ... Entscheidung in DDP machen zu können, müsste man, entweder den Boolschen Ausdruck ausschreiben, oder den ungleich Operator benutzen.

Das Ausschreiben ist da aber viel zu lang: Wenn (nicht a und b) ist oder (a und nicht b) ist, ... und den ungleich Operator bei Wahrheitswerten zu benutzen macht Sprachlich wenig sinn.

Beispiel

Die Zahl z ist 4.
Der Text t ist "".

Wenn entweder t leer ist, oder z größer als 5 ist, Schreibe "hi". [ Ausgabe: hi ]

Implementation

Der entweder ..., oder ... ist nur Zucker für den ungleich operator, da er sich genau so verhält wie ein XOR.


Hinweis: Diese PR hat nichts mit #65 zu tun - es fügt nur entweder ... oder als Binären Operator hinzu.

@NotLe0n NotLe0n added the Typ: Neues Feature Neues Feature label Jun 15, 2024
@NotLe0n NotLe0n requested a review from bafto June 15, 2024 12:32
@NotLe0n NotLe0n self-assigned this Jun 15, 2024
Copy link
Member

@bafto bafto left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ein XOR Operator ist eine gute Idee, allerdings braucht es tatsächlich einen eigenen Operator, und nicht nur Syntax-Sugar:

Schreibe (entweder "Hallo", oder "Welt") auf eine Zeile.

Die Ausgabe ist "wahr", was überhaupt keinen Sinn macht, da man entweder "Hallo" oder "Welt" erwarten würde.

Dieser naive Fix funktioniert auch nicht:

return &ast.BinaryExpr{
	Range: token.Range{
		Start: tok.Range.Start,
		End:   rhs.GetRange().End,
	},
	Tok: *tok,
	Lhs: &ast.CastExpr{
		Range: lhs.GetRange(),
		Lhs:   lhs,
		Type:  ddptypes.WAHRHEITSWERT,
	},
	Operator: ast.BIN_UNEQUAL,
	Rhs: &ast.CastExpr{
		Range: rhs.GetRange(),
		Lhs:   rhs,
		Type:  ddptypes.WAHRHEITSWERT,
	},
}

denn die Fehlermeldung wäre:

Typ Fehler (3004) in test.ddp (Z: 3, S: 20)

3 |  Schreibe (entweder "Hallo", oder "Welt") auf eine Zeile.
  |                     ^^^^^^^

Ein Ausdruck vom Typ Text kann nicht in den Typ Wahrheitswert umgewandelt werden.

Diese Fehlermeldung ist nicht sonderlich genau, und man kennt sie eigentlich nur vom als Operator.

@NotLe0n NotLe0n requested a review from bafto June 15, 2024 15:46
src/compiler/compiler.go Show resolved Hide resolved
src/parser/expressions.go Show resolved Hide resolved
@NotLe0n NotLe0n requested a review from bafto June 15, 2024 16:06
@NotLe0n NotLe0n merged commit bc19123 into dev Jun 15, 2024
6 checks passed
@NotLe0n NotLe0n deleted the entweder-oder branch June 15, 2024 16:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Typ: Neues Feature Neues Feature
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants