- Heb nog een fout(je) uit TSimpleEval gehaald.
- De "functies" kunnen nu ook met een lege parameterlijst werken ,dat is nodig, bv bij de functie "Pi()".
- Heb nog een fout(je) uit TSimpleEval gehaald.
- De "functies" kunnen nu ook met een lege parameterlijst werken ,dat is nodig, bv bij de functie "Pi()".
Last edited by Dany; 17-Jul-07 at 15:39.
Hi,
De functietabel is aangepast, de "test" functies zijn eruit en een aantal rekenkundige en goniometrische zijn toegevoegd (27 functies in totaal):
Zoals je kunt zien is nu ook de operator "^" (power) ondersteund.Code:const SimpleEvalOperators = ['+', '-', '*', '/', '^', '%']; SimpleEvalFunctions: array[0..26] of string = ('abs', 'int', 'frac', 'round', 'ceil', 'floor', 'sum', 'avg', 'min', 'max', 'sqrt', 'pi', 'logn', 'log', 'power', 'sign', 'rad', 'deg', 'cmp', 'ln', 'exp', 'sin', 'cos', 'tan', 'arcsin', 'arccos', 'arctan');
Pas op: Als je functies gebruikt met meer dan 1 argument (of met 1 argument met een decimaal teken erin) dan moet je wel als "decimalseparator" de "." gebruiken: de komma dient als scheidingsteken tussen argumenten.
Veel plezier...
p.s. ondertussen zijn er al meer functies en operatoren, zie eerste post voor een overzicht daarvan plus de laatste interface definitie.
Last edited by Dany; 20-Jul-07 at 18:25.
Hoi,
Er zijn nu een aantal exceptions toegevoegd die fouten in de expressie (die ge-evalueerd wordt) beter aanduiden.
Bijgevoegd: een simpel "TestEval" project, laat toe even te experimenteren... = verplaatst naar de eerste post van TSimpleEval. Zie
http://www.nldelphi.com/Forum/showthread.php?t=28402
Last edited by Dany; 17-Jul-07 at 23:10.
Paar kleine puntjes:
- ESimpleEvalException is gedeclareerd in de implementation sectie, kun je hem dan wel in andere units gebruiken bij het afvangen?
- In TSimpleEval.SetVar vang je alle excepties af, volgens mij kun je daar ook een specifieke exceptie afvangen.
- In function SolveFunction kun je voor het vullen van de Argument array ook gebruiken:
Dacht ik.Code:SetLength(Argument, ArgS.Count); for I := 0 to ArgS.Count - 1 do Argument[I] := EvalNumerical(ArgS[I]);
Hoi Jelmer,
Dat dacht je goed. Alles al gewijzigd. Bedankt voor je opmerkingen.Dacht ik.
Nog toegevoegd: exception onderscheid tussen links haakje en rechts haakje afwezig bij functie aanroepen.
Wijzigingen:
- De functie "IfThen" is toegevoegd. Zie commentaar in de sourcefile voor de werking ervan.
En, samen met de ">", "<" en "=" opratoren (zie hieronder) kan men zoiets maken:
IfThen(a > b, c, d) geeft dus c terug als a > b, zoniet geeft "Ifthen" d terug. "a", "b" etc kunnen natuurlijk zelf weer expressies zijn met bv IfThen's erin...
- De verwerking van geneste functieaanroepen met meerdere argumenten is nu ok voor zover ik kan zien.
Last edited by Dany; 20-Jul-07 at 18:34.
Toevoegingen: de "=", "<" en ">" operatoren (geven "1" als "true" en "0" als "false").
Verder is de code wat opgeschoond.
Hmm dat lijkt me wat onintuitief voor grotere expressies, b.v.
wat geeft "1=0 > 2=5"
Heeft dat zin?
Hoi Marcov, bedankt voor je antwoord.
Het heeft inderdaad enkel zin in combinatie mat de "IfThen" functie, bv:
gewoon omdat "IfThen" het eerste argument test op "1" of "0".Code:IfThen ( a > b, c, d)
Ook de laatst toegevoegde functie "not" (zie volgende post) werkt met die waarden.
Ik heb 0 en 1 gekozen omdat dat toevallig de ordinale waarden van "false" en "true" zijn in (Delphi) pascal.
Last edited by Dany; 20-Jul-07 at 18:35.
De functie "not" is toegevoegd.
De volgende expressie wordt nu dus mogelijk:
Betekent: als a niet gelijk is aan b, geef dan c anders d.Code:IfThen( not ( a = b ), c, d)
De "ongelijk aan" en "not" operatoren zelf bestaan niet in TSimpleEval, de "not" functie bestaat dus nu wel.
Last edited by Dany; 20-Jul-07 at 18:36.
Toevoeging:
[verouderd]
In de "IfThen" functie is voor het eerste argument (de "test") nu de operator "+" te gebruiken als logische "or". Dus,
IfThen ((a > b) + (c > d), e, f) :betekent:
[I]if ((a > b) or (c > d)) then e else f.
Wat al mogelijk was:
IfThen ((a > b) * (c > d), e, f) :betekent:
if ((a > b) and (c > d)) then e else f.
Een en ander betekent dat de functie "Ifthen" nu alle waarden >= 1 als "true" aanziet. De "not" functie is ook aangepast in die zin.
[/verouderd]
[edit] (na de opmerking van Marcov, zie volgende post)
De operatoren "&" (logische "and") en "|" (logische "or") zijn nu ook toegevoegd.
Die zouden moeten gebruikt worden in plaats van "+" en "*" die hierboven beschreven zijn.
"+" en "*" gebruiken blijft wel mogelijk, dat kan ik niet verhinderen...
Dit wordt dus:
IfThen ((a > b) | (c > d), e, f) :betekent:
if ((a > b) or (c > d)) then e else f.
IfThen ((a > b) & (c > d), e, f) :betekent:
if ((a > b) and (c > d)) then e else f.
Bedankt Marcov.
[/edit]
Last edited by Dany; 07-Aug-07 at 15:03.
Brrr, dat vind ik erg eng. Recyclen van operators, en dan ook nog afhankelijk van een functie context ? Brrr. Brrr. Vies bah.
Wat als je b.v. ifthen gaat nesten? Iets als ifthen(iets*ifthen()) gaat het dan ook nog wel goed ?
Dat komt natuurlijk omdat TSimpleEval nog steeds geen multicharacter operatoren aankan. Van zodra dat kan maak ik de "and" en "or" operatoren.
Yep. Op voorwaarde dat je er rekening mee houdt dat alles >= 1 als "true" beschouwd wordt in het eerste argument van IfThen (zie "test" hieronder).Wat als je b.v. ifthen gaat nesten? Iets als
ifthen(iets*ifthen(), true_expressie, false_expressie)
gaat het dan ook nog wel goed ?
Eigenlijk denk ik dat geneste IfThen's er zo zouden uitzien (een if then else if then else... constructie):
IfThen(test, ifthen(test, true_expressie, ifthen(test, true_expressie, false_expressie) ), false_expressie) .
dus de true_expressie en/of de false_expressie op hun beurt vervangen door IfThen's.
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks