PB4 Interpretation bool'scher Ausdrücke

Fragen und Bugreports zur PureBasic 4.0-Beta.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

im ersten beispiel fehlen sowieso die klammern um den ausdruck...

aber geht ja trotzdem nicht..

es scheint, als ob erst du die verwendung von "Or #False" (bzw. "#False Or") der (nicht existente) "Typ" 'Boolean' auf den ausdruck ge-cast-et wird.

aber da es dann funktioniert, und ebenso bei verwendung innerhalb von If-statements,
finde ich es merkwürdig, daß es nicht einfach so bestandteil einer rechnung sein kann.

nochmal ein hinweis:

Code: Alles auswählen

b = a > 60 
ist falsch, es muss

Code: Alles auswählen

b = (a > 60) 
heißen.
Die Klammern kennzeichnen den Ausdruck als Boole'schen Ausdruck innerhalb einer Berechnung.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@IngolfZ,
Sorry noch wegen den rauen ton von mir.

André hat Fed und fr34k darüber informiert. Mal abwarten was Fred dazu sagt :)


@Kaeru Gaman,
hiermit funktioniert es auch für PB4

Code: Alles auswählen

Macro IsTrue(Ext)
  (#False Or(Ext))
EndMacro

Macro IsFalse(Ext)
  (#False Or Not(Ext))
EndMacro

a = 60
Debug IsTrue(a > 65)

b = 10 + IsTrue(a>65) * 20
Debug b

b = 10 + IsFalse(a>65) * 20
Debug b
hatte ich schon mal geschrieben. kannst ja mal ausprobieren.

Osterfeuer war gut. Frohe Ostern euch noch :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
horst
Beiträge: 70
Registriert: 08.09.2004 19:33
Wohnort: München
Kontaktdaten:

Beitrag von horst »

Kaeru Gaman hat geschrieben:...Die Klammern kennzeichnen den Ausdruck als Boole'schen Ausdruck innerhalb einer Berechnung.
Klammern kennzeichnen eigentlich Ausdrücke von der Art, die durch den jeweiligen Kontext bestimmt wird. Und da gibt es zum Beispiel einen arithmetischen Kontext oder einen Konditionen-Kontext. Ich halte nichts davon, beides zu vermischen, genauer gesagt, ich stimme mit Fred überein, dass Boolsche Ausdrücke nicht wie arithmetische behandelt werden sollten.

Dagegen halte ich es für sauber und korrekt, Boolsche Ausdrücke durch eine Funktion in einen arithmetischen Kontext zu überführen, also z.B. in der Form Is(BooleanExpression).

Ein Boolscher Ausdruck ist zunächst einmal WAHR oder UNWAHR, was mit Werten überhaupt nichts zu tun hat.

Erst wenn WAHR/UNWAHR in einer Programmiersprache bestimmten Werten zugeordnet wird, z.B. #true=1 und not true aka #false=0, ist es möglich, einen Boolschen Ausdruck zu bewerten. Dabei wird eine Methode angewendet, die nichts mit Arithmetik zu tun hat, deren Resultat aber ein numerischer Wert ist. Ein typischer Fall für eine Funktion also.

IMHO ist die Vermischung von Boolschen und arithmetischen Ausdrücken unsauberer (wenn auch nicht ungewöhnlicher) Programmierstil.

Um es nochmal zu sagen: Dass wir eine einfache Nutzung von Boolschen Ausdrücken in PureBasic brauchen, ist unbestritten. Ich halte dafür allerdings eine nur Funktion für angemessen.
horst
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@mk

> hiermit funktioniert es auch für PB4
> hatte ich schon mal geschrieben.

hatte ich auch schon zur kenntnis genommen, und das "#False Or" hatte ich selbst auch erwähnt.


@horst

das ist eine argumentation! du hast mich überzeugt.

> Dass wir eine einfache Nutzung von Boolschen Ausdrücken in PureBasic brauchen, ist unbestritten. Ich halte dafür allerdings eine nur Funktion für angemessen.

is ok for me.

ob diese form einer funktion allerdings als procedure implementiert wird,
oder vielleicht besser aus performance-gründen als compilermacro,
bitte ich noch zu überdenken.
einen extra-call halte ich für ungünstig.


> André hat Fred und fr34k darüber informiert. Mal abwarten was Fred dazu sagt

da bin ich aber auch mal gespannt...


euch allen auch ein fröhliches Frühlingsfest / Fruchtbarkeitsfest / Passah / Pessach
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
horst
Beiträge: 70
Registriert: 08.09.2004 19:33
Wohnort: München
Kontaktdaten:

Beitrag von horst »

Kaeru Gaman hat geschrieben: ob diese form einer funktion allerdings als procedure implementiert wird,
oder vielleicht besser aus performance-gründen als compilermacro,
bitte ich noch zu überdenken.
Da mach ich mir bei Fred keine Sorgen. Chr(n) zum Beispiel braucht auch keine runtime Procedure.
horst
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Beitrag von ullmann »

Hallo,

aus mehreren anderen Sprachen kenne ich

0 = False
alle anderen Werte = True (werden als True bei IF akzeptiert)
-1 = True (Rückgabewert von Not False)

Um IF Then Befehle zu vermeiden, habe ich oft logische Ausdrücke in mathematische Ausdrücke eingebaut. Das hat in anderen Sprachen immer funktioniert.

Es sollte deshalb unbedingt auch in PB funktionieren, und nicht erst mit unnützen Konvertierungsfunktionen wie oben vorgeschlagen.

Gestört hat mich, dass ich in mathematischen Ausdrücken True erst mit -1 multiplizieren musste oder statt Addition eine Subtraktion verwenden musste. Das hat den Ausdruck ein klein wenig unübersichtlicher gemacht.

Seit einiger Zeit arbeite ich mit Lotus 123, hier ist der Rückgabewert für True +1. Das gefällt mir besser. Eingebaut in mathematischen Ausdrücken sind diese besser lesbar.

Rainer
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag von jear »

@Horst
Dagegen halte ich es für sauber und korrekt, Boolsche Ausdrücke durch eine Funktion in einen arithmetischen Kontext zu überführen, also z.B. in der Form Is(BooleanExpression).
Völlige Übereinstimmung. Hoffen wir also, dass Fred das so macht. Schließlich wollen wir nicht alle naselang das Thema wieder aufwärmen müssen. Solange tut es aber auch ein Macro.

Code: Alles auswählen

Macro Is(BooleanExpression) 
  (#False Or(BooleanExpression)) 
EndMacro 


a = 50 : Debug Is(a<60) : Debug Is(a=60) : Debug Is(a>60)
a = 60 : Debug Is(a<60) : Debug Is(a=60) : Debug Is(a>60)
a = 70 : Debug Is(a<60) : Debug Is(a=60) : Debug Is(a>60)

File.s = "Test.vob"
IsVOB.b = Is(LCase(GetExtensionPart(file)) = "vob")
Debug IsVOB
Frohe Restostern!
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag von freak »

Also implementiert werden wird es, aber wann genau steht noch nicht fest.

@Kaeru Gaman:
Ich erntete Spott von anderen Usern, Ignoranz von Freak, und
Fred hielt es offenbar für unter seiner Würde, überhaupt zu antworten.

...wahrscheinlich hat er aber einfach so sehr den Überblick verloren, dass er überhaupt nicht in der Lage wäre, das zu implementieren, selbst wenn er wollte. Dann hat er halt einfach nicht den Mumm, das zuzugeben.
Also bei solchen Aussagen brauchst du dich nicht zu wundern wenn du ignoriert wirst... nur mal so als Tipp.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Also bei solchen Aussagen brauchst du dich nicht zu wundern wenn du ignoriert wirst... nur mal so als Tipp.

solche aussagen kommen im nachhinein, wenn man nicht für voll genommen wird, obwohl man mit ner vernünftigen frage ankommt.
nur mal so als tipp.


interessant auch, dass eine aussage wie
> Also implementiert werden wird es, aber wann genau steht noch nicht fest.
erst hier und jetzt kommt, aber wenn ich mal im englischen forum frag krieg ich blöde sprüche zu hören.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag von freak »

Ich habe lediglich geantwortet das das ganze für mich keine wirkliche Priorität ist.
Das hat nichts mit nicht für voll nehmen zu tun.
Das du gleich eingeschnappt bist wenn es nicht nach deiner Meinung geht kann ich ja nicht ändern.

Errinnert irgendwie an ein Kind das nicht das Spielzeug kriegt das es haben will...

Im übrigen stand zu dem Zeitpunkt noch keine Entscheidung fest, desshalb
konnte ich eine Aussage wie die obige auch nicht machen.
Gesperrt