Page 2 of 4 FirstFirst 1 2 3 4 LastLast
Results 16 to 30 of 46

Thread: NLDRcsEval

  1. #16
    Quote Originally Posted by marcov View Post
    Kan je al hex/bin/oct waarden in je expressies gebruiken?
    Nee, dat kan ik nog niet.

    Quote Originally Posted by GolezTrol View Post
    of gewoon het woord 'mod'
    Als ik dit implementeer in TSimpleEval dan is het niet meer "Simple". Nu ondersteun ik alleen operatoren van 1 character en geen functies...
    Last edited by Dees; 03-Jul-07 at 21:00.

  2. #17
    Hoi beste Moderator,

    Ik heb het gevoel dat deze thread ergens anders thuishoort dan bij NLDCalcString, althans toch de antwoorden op de eerste post. Ik wil de threads van SVG niet verontreinigen met een discussie over de "%" operator (die niet voorkomt in NLDCalcString, dus...).

    Ik zou graag willen voorstellen deze thread te verhuizen naar:
    http://www.nldelphi.com/Forum/showpo...30&postcount=6
    daar hoort ie meer thuis denk ik.

    Bij voorbaat dank,
    Dany
    Last edited by Marcel; 03-Jul-07 at 23:52.

  3. #18
    Uw wens...
    Marcel

  4. #19
    Het is dus duidelijk: ik mag "%" niet gebruiken voor wat ik wil dat mijn "percentage" operator doet. In een aantal programmeertalen (C, Java) is de "%" de "modulo" operator (rest van een gehele deling).
    Ik zal dus "%" niet meer gebruiken en vervangen door iets anders.
    Weet iemand of de operatie "Left / Right * 100" al ergens een binaire operator heeft (van 1 teken)?
    Alvast bedankt.

  5. #20
    Ik zou me er persoonlijk niet door laten weerhouden dat % ergens anders een modulo is. De gemiddelde programmeertaal heeft tenslotte geen procent-formule. Ik zou het logischer vinden dat je % voor procenten gebruikt en iets anders voor modulo, dan dat je % voor modulo gebruikt en een ander symbool voor percentages.
    1+1=b

  6. #21
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Ik denk dat je % best mag gebruiken. Je kan toch niet alle talen perfect bedienen (zeker niet als je Perl meerekent die zowat elk niet leesbaar teken als operator definieert)

    De enkel teken limitatie vind ik wel een enorm nadeel. Dat is op te lossen door een simpele tokenizer (ook wel lexer genaamd) te bouwen. De parser splitsen in een tokenizer en een (echte) parser dus.

    Wat een tokenizer typisch doet is een string van links naar rechts doorlopen, en voor ieder groep je tekens dat bij elkaar hoort, een symbool (meestal een enumeratie) teruggeven. Deze scheiding introduceren houdt je parser eenvoudig en snel ( if functie=Mijn_tokenizer_enum_sinus then.. ipv if copy(s,x,3)='sin'), en geeft je toch de kracht van meer tekens.

  7. #22
    Hoi, Er is een nieuwe versie van TSimpleEval die toelaat "functies" te gebruiken. Ik heb nog niets veranderd aan de operatoren, die zijn nog altijd maximaal 1 teken lang. Dat veranderen komt nog wel...

    Momenteel zijn er (voor test doeleinden) maar 4 functies (vrij willekeurige) ingebouwd:
    Code:
    const
      Functions: array[0..3] of string = ('dbl', 'sqrt', 'sum', 'square');
    De evaluator kan dus nu expressies aan als bv "sqrt(a + square(b)) + sum(c,d,e)".

    TSimpleEval is uiteraard iets minder "simpel" geworden.

    p.s.
    "dbl" is een functie die het dubbele van zijn argument levert
    "sqrt" levert de vierkantswortel van zijn argument
    "sum" levert de som van zijn argumenten en
    "square" levert het kwadraat van zijn argument


    Om een functie toe te voegen moet je
    1. Bovenstaand array "Functions" uitbreiden (vergeet de array dimensie niet)
    2. Een stukje code toevoegen aan de routine "SolveFunction", zie hieronder de huidige functies als voorbeeld:
    Code:
          // ------------------------------ //
          // Execute the actual function.   //
          // ------------------------------ //
    
          // Its arguments are in Argument[0]..Argument[n-1]
          // (n = the number of arguments)
    
          if Func_ = 'dbl' then
          begin
            Result := 2 * Argument[0];
            Exit;
          end;
    
          if func_ = 'sqrt' then
          begin
            Result := Sqrt(Argument[0]);
            Exit;
          end;
    
          if func_ = 'sum' then
          begin
            for I := 0 to Length(Argument) - 1 do
            Result := Result + Argument[I];
            Exit;
          end;
    
          if func_ = 'square' then
          begin
            Result := Argument[0] * Argument[0];
            Exit;
          end;
    Veel Plezier.
    Last edited by Dany; 14-Jul-07 at 13:45.

  8. #23
    ik zou dan opteren om "square" te veranderen in "sqr"
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  9. #24
    Of in sq. De r in sqrt is tenslotte van Root (Square root).

    Misschien is het nog wel handiger om er gewoon power (of pwr) van te maken:
    x power y

    Bijv '5 pwr 2' = Power(5, 2) = 25
    Last edited by GolezTrol; 08-Jul-07 at 22:48.
    1+1=b

  10. #25
    En als je het wat lastiger wilt maken, dan laat je je inspireren door OCRCal.
    Last edited by GolezTrol; 08-Jul-07 at 22:48.
    1+1=b

  11. #26
    Quote Originally Posted by Henkie View Post
    ik zou dan opteren om "square" te veranderen in "sqr"
    Bedankt voor de reply . Bedenk wel dat dit "test" functies zijn (vb "dbl" is duidelijk een "nep" functie). Ik weet dat in Pascal de naam "sqr" staat voor de functie "square".
    Het is de bedoeling dat de gebruikers van TSimpleEval die uitbreiden met de functies die ze werkelijk nodig hebben (en misschien die functies eruitlaten die ze niet nodig hebben)

    Vraagje: welke functies moeten er minimaal zijn in een "simpele" evaluator? De standaard Pascal functies (met uiteraard dezelfde naam als in Pascal)?
    Last edited by Dany; 09-Jul-07 at 21:45.

  12. #27
    Quote Originally Posted by GolezTrol View Post
    Misschien is het nog wel handiger om er gewoon power (of pwr) van te maken:
    x power y Bijv '5 pwr 2' = Power(5, 2) = 25
    In de uitdrukking "x power y" zou ik (in TSimpleEval althans) "power" beschouwen als een operator (in TSimpleEval" kan nog steeds geen meer-characterige operators aan), geen functie.
    "Power(x, y)" is wel een functie en veel universeler dan "sqr(x)", en verdient inderdaad de voorkeur.

  13. #28
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    sqrt, ln en exp en de basis gonio functies zijn IMHO het belangrijkst.

    Overigens ondersteunt FPC 2**5 = 2 tot de macht 5. De notatie als expressie is iets natuurlijker, en vermijdt het opzoeken/twijfel over wat het basis getal is, en wat de exponent.

  14. #29
    Quote Originally Posted by marcov View Post
    Overigens ondersteunt FPC 2**5 = 2 tot de macht 5. De notatie als expressie is iets natuurlijker, en vermijdt het opzoeken/twijfel over wat het basis getal is, en wat de exponent.
    Hoi Marcov, bedankt.
    Je hebt gelijk: "2**5" ziet er logischer uit dan "power(2,5)". Dit betekent uiteraard wel dat, als ik dat wil maken, TSimpleEval weer wat minder "simple" zal worden omdat ik dan dus meer-characterige operators moet aankunnen. Dat wordt dus de volgende uitbreiding.

    Wat is "FPC" trouwens? (Forensish Psychiatrisch Hospitaal?)
    Last edited by Dany; 10-Jul-07 at 21:23.

  15. #30
    Free Pascal Compiler, daarmee proberen ze Delphi te comileren onder meerdere platformen
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

Page 2 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
  •