Příklad:

V ukázce konkrétního použití mutátorů z této části navážeme na natural a vytvoříme další dva parsery pro číselné typy -- pro čísla celá a čísla s pohyblivou řádovou čárkou.

Parser celých čísel se liší od natural tím, že mu může předcházet znaménko mínus. Podle jeho výskytu mutátor volby vydá hodnotu $1$ resp. $-1$ jíž je vynásobeno:

int(W):-
 W :->  ( symbol("-")<?@?>1-const(-1)
           <&>>
          natural <@ alter(C>N,C*N) => eval ).
Slíbeným druhým parserem je double. Nejdříve definujeme parser pro zlomkovou část:
fractionalPart(W):-
 W :->  ( digit<<+>> <@ foldR(evalFract,0.0) ).
        
evalFract(I,Acc,Result):-
        Result is (I+Acc)/10.
Číslo s pohyblivou řádovou čárkou se skládá z celočíselné části, desetinné tečky, desetinné části, znaku e nebo E a celočíselného exponentu. Jak je vidět, desetinná nebo exponentová část může být vynechána:
double(W):-
 W :->
     ((int
        <&>>
       (symbol(".") &> fractionalPart)<<?@>>0.0-id
        <&>>
       (symbols("eE") &> int)<<?@>>0.0-id) 
                                      <@ evalDouble).

evalDouble(I>(F>E),R):-
        I<0 -> R is (I+F*(-1))*10^E ; R is (I+F)*10^E.
Použití právě zkonstruovaného parseru vyzkoušíme na příkladu:
?- double(s("-1.2e-3")+L).
L = [s([])> -0.0012] 
Yes



dvorka 2013-12-31