1
0
forked from GitHub/gf-rgl
Files
gf-rgl/src/ancient_greek/NumeralGrc.gf
Krasimir Angelov fb398c603e The new Decimal API
2023-08-21 20:14:26 +02:00

104 lines
4.1 KiB
Plaintext

--# -path=.:../abstract:../common:../prelude:
concrete NumeralGrc of Numeral = CatGrc ** open ResGrc, MorphoGrc, Prelude in {
lincat
Digit = {s : DForm => CardOrd => Str} ;
Sub10 = {s : DForm => CardOrd => Str ; n : Number} ;
Sub100 = {s : CardOrd => Str ; n : Number} ;
Sub1000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000 = {s : CardOrd => Str ; n : Number} ;
Sub1000000000000 = {s : CardOrd => Str ; n : Number} ;
lin num x = x ;
oper -- n1 not in abstract
thousand : CardOrd => Str = cardOrd "ci'lioi" "ciliosto's" "cilia'kis" ;
tenthousand : CardOrd => Str = cardOrd "my'rioi" "myriosto's" "myria'kis" ;
n1 = mkDigit "ei(~s" "e('ndeka" "de'ka" "prw~tos" "a('pax" ;
lin -- mkDigit d (d+10) (d*10) d-th d-times
-- -----------------------------------------------------------------------
n2 = mkDigit "dy'o" "dw'deka" "ei)'kosi" "dey'teros" "di's" ;
n3 = mkDigit "trei~s" ("trei~s"++"kai`"++"de'ka")
"tria'konta" "tri'tos" "tri's" ;
n4 = mkDigit "te'ttares" ("te'ttares"++"kai`"++"de'ka")
"tettara'konta" "te'tartos" "tetra'kis" ;
n5 = mkDigit "pe'nte" "pentekai'deka" "penth'konta" "pe'mptos" "penta'kis" ;
n6 = mkDigit "e('x" "e(kkai'deka" "e(xh'konta" "e('ktos" "e(xa'kis" ;
n7 = mkDigit "e(pta'" "e(ptakai'deka" "e(bdomh'konta" "e('bdomos" "e(pta'kis" ;
n8 = mkDigit "o)ktw'" "o)ktwkai'deka" "o)gdoh'konta" "o)'gdoos" "o)kta'kis" ;
n9 = mkDigit "e)nne'a" "e)nneakai'deka" "e)nenh'konta" "e)'natos" "e)na'kis" ;
pot01 = n1 ** {n = Sg} ; -- 1
pot0 d = d ** {n = Pl} ; -- d * 1
pot1 d = {s = d.s ! DTen} ** {n = Pl} ; -- d * 10
pot110 = pot1 n1 ; -- 10
pot1to19 d = {s = d.s ! DTeen} ** {n = Pl} ; -- 10 + d
pot111 = pot1to19 n1 ; -- 11
pot0as1 n = {s = n.s ! DUnit} ** {n = n.n} ; -- coerce : Sub10 -> Sub100
pot1plus d e = -- d * 10 + e
-- let kai : Str = ("kai`" | "") in -- too expensive! -- BR 73.2
{ s = \\f => d.s ! DTen ! f ++ "kai`" ++ e.s ! DUnit ! f ; n = Pl} ;
pot1as2 n = n ; -- coerce : Sub100 -> Sub1000
pot2 d = { s = \\f => d.s ! DHundred ! f ; n = Pl} ; -- d * 100
pot2plus d m = { -- d * 100 + m
s = \\f => d.s ! DHundred ! f ++ "kai`" ++ m.s ! f ; n = Pl} ; -- BR 73.2
pot2as3 n = n ;
-- d * 1000
pot3 d = { s = \\f => d.s ! NAdv ++ (thousand ! f) ; n = Pl} ;
pot3plus d m = {
s = \\f => d.s ! NAdv ++ thousand ! f ++ "kai`" ++ m.s ! f ; n = Pl} ;
pot3as4 n = n ;
pot4as5 n = n ;
-- numerals as sequences of digits
lincat
Dig = TDigit ;
lin
IDig d = {s = d.s ! one; unit = ten} ;
IIDig d i = {
s = d.s ! i.unit ++ i.s ;
unit = inc i.unit
} ;
D_0 = mkDig "-" "-" "-" ; -- avoid empty Dig
D_1 = mkDig "a" "i" "r" ;
D_2 = mkDig "b" "k" "s" ;
D_3 = mkDig "g" "l" "t" ;
D_4 = mkDig "d" "m" "y" ;
D_5 = mkDig "e" "n" "f" ;
D_6 = mkDig "s*" "x" "c" ; -- TODO: replace s* by stigma (not in ut -ancientgreek)
D_7 = mkDig "z" "o" "q" ;
D_8 = mkDig "h" "p" "w" ;
D_9 = mkDig "v" "K" "P" ; -- TODO: replace K by koppa, P by sampi (not in ut -ancientgreek)
PosDecimal d = d ** {hasDot=False} ;
oper
TDigit = {
s : Unit => Str
} ;
mkDig : Str -> Str -> Str -> TDigit =
\one,ten,hundred -> { s = table Unit [one;ten;hundred] } ;
inc : Unit -> Unit = \u ->
case u of {
one => ten ;
ten => hundred ;
-- hundred => thousand ;
-- thousand => myriad ;
-- myriad => myriad
hundred => hundred
} ;
}