forked from GitHub/gf-rgl
partial implementation of Ancient Greek RGL
This commit is contained in:
97
src/ancient_greek/NumeralGrc.gf
Normal file
97
src/ancient_greek/NumeralGrc.gf
Normal file
@@ -0,0 +1,97 @@
|
||||
--# -path=.:../abstract:../common:../prelude:
|
||||
|
||||
concrete NumeralGrc of Numeral = CatGrc ** open ResGrc, MorphoGrc 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} ;
|
||||
|
||||
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} ;
|
||||
|
||||
|
||||
-- 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)
|
||||
|
||||
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
|
||||
} ;
|
||||
}
|
||||
Reference in New Issue
Block a user