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
resp.
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