Page 3 of 4 FirstFirst 1 2 3 4 LastLast
Results 31 to 45 of 46

Thread: NLDRcsEval

  1. #31
    - 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.

  2. #32
    Hi,

    De functietabel is aangepast, de "test" functies zijn eruit en een aantal rekenkundige en goniometrische zijn toegevoegd (27 functies in totaal):
    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');
    Zoals je kunt zien is nu ook de operator "^" (power) ondersteund.

    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.

  3. #33
    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.

  4. #34
    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:
    Code:
      SetLength(Argument, ArgS.Count);
      for I := 0 to ArgS.Count - 1 do
        Argument[I] := EvalNumerical(ArgS[I]);
    Dacht ik.

  5. #35
    Hoi Jelmer,
    Dacht ik.
    Dat dacht je goed. Alles al gewijzigd. Bedankt voor je opmerkingen.

  6. #36
    Nog toegevoegd: exception onderscheid tussen links haakje en rechts haakje afwezig bij functie aanroepen.

  7. #37
    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.

  8. #38
    Toevoegingen: de "=", "<" en ">" operatoren (geven "1" als "true" en "0" als "false").
    Verder is de code wat opgeschoond.

  9. #39
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Hmm dat lijkt me wat onintuitief voor grotere expressies, b.v.

    wat geeft "1=0 > 2=5"

    Heeft dat zin?

  10. #40
    Hoi Marcov, bedankt voor je antwoord.
    Het heeft inderdaad enkel zin in combinatie mat de "IfThen" functie, bv:
    Code:
    IfThen ( a > b, c, d)
    gewoon omdat "IfThen" het eerste argument test op "1" of "0".
    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.

  11. #41
    De functie "not" is toegevoegd.
    De volgende expressie wordt nu dus mogelijk:
    Code:
    IfThen( not ( a = b ), c, d)
    Betekent: als a niet gelijk is aan b, geef dan c anders 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.

  12. #42
    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.

  13. #43
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    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 ?

  14. #44
    Quote Originally Posted by marcov View Post
    Brrr, dat vind ik erg eng. Recyclen van operators, en dan ook nog afhankelijk van een functie context ? Brrr. Brrr. Vies bah.
    Dat komt natuurlijk omdat TSimpleEval nog steeds geen multicharacter operatoren aankan. Van zodra dat kan maak ik de "and" en "or" operatoren.

    Wat als je b.v. ifthen gaat nesten? Iets als
    ifthen(iets*ifthen(), true_expressie, false_expressie)
    gaat het dan ook nog wel goed ?
    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).

    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.

  15. #45
    Quote Originally Posted by marcov View Post
    Brrr, dat vind ik erg eng. Recyclen van operators, en dan ook nog afhankelijk van een functie context ? Brrr. Brrr. Vies bah.
    Hoi Marcov, ik heb een tussenoplossing: TSimpleEval kent nu de logische operatoren "&" (logische and) en "|" (logische or). Daarmee kunnen dus ingewikkelder logische expressies gemaakt worden. Geen "recycled" operatoren meer .

Page 3 of 4 FirstFirst 1 2 3 4 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •