Files
gf-rgl/src/belarusian/NumeralBel.gf
T
2026-09-22 16:36:30 +02:00

106 lines
3.4 KiB
Plaintext

concrete NumeralBel of Numeral = CatBel ** open Prelude in {
lincat
Digit = {
s, fem, teen, ten, hundred : Str ;
form : NumForm
} ;
Sub10, Sub100, Sub1000 = {
s, fem, hundred : Str ;
form : NumForm
} ;
Sub1000000, Sub1000000000, Sub1000000000000 = {s : Str} ;
Dig = {s : Str} ;
lin
num n = n ;
n2 = mkDigit "два" "дзве" "дванаццаць" "дваццаць" "дзвесце" Few ;
n3 = mkDigit "тры" "тры" "трынаццаць" "трыццаць" "трыста" Few ;
n4 = mkDigit "чатыры" "чатыры" "чатырнаццаць" "сорак" "чатырыста" Few ;
n5 = mkDigit "пяць" "пяць" "пятнаццаць" "пяцьдзясят" "пяцьсот" Many ;
n6 = mkDigit "шэсць" "шэсць" "шаснаццаць" "шэсцьдзясят" "шэсцьсот" Many ;
n7 = mkDigit "сем" "сем" "сямнаццаць" "семдзесят" "семсот" Many ;
n8 = mkDigit "восем" "восем" "васямнаццаць" "восемдзесят" "восемсот" Many ;
n9 = mkDigit "дзевяць" "дзевяць" "дзевятнаццаць" "дзевяноста" "дзевяцьсот" Many ;
pot01 = {s = "адзін"; fem = "адна"; hundred = "сто"; form = One} ;
pot0 d = d ;
pot0as1 n = n ;
pot110 = mkNum "дзесяць" Many ;
pot111 = mkNum "адзінаццаць" Many ;
pot1to19 d = mkNum d.teen Many ;
pot1 d = mkNum d.ten Many ;
pot1plus d n = {
s = d.ten ++ n.s ;
fem = d.ten ++ n.fem ;
hundred = [] ;
form = n.form
} ;
pot1as2 n = n ;
pot21 = mkNum "сто" Many ;
pot2 n = mkNum n.hundred Many ;
pot2plus n m = {
s = n.hundred ++ m.s ;
fem = n.hundred ++ m.fem ;
hundred = [] ;
form = m.form
} ;
pot2as3 n = n ;
pot31 = {s = "тысяча"} ;
pot3 n = {s = n.fem ++ scaleForm n.form "тысяча" "тысячы" "тысяч"} ;
pot3plus n m = {s = (pot3 n).s ++ m.s} ;
pot3as4 n = n ;
pot3decimal d = {s = d.s ++ "тысяч"} ;
pot41 = {s = "мільён"} ;
pot4 n = {s = n.s ++ scaleForm n.form "мільён" "мільёны" "мільёнаў"} ;
pot4plus n m = {s = (pot4 n).s ++ m.s} ;
pot4as5 n = n ;
pot4decimal d = {s = d.s ++ "мільёна"} ;
pot51 = {s = "мільярд"} ;
pot5 n = {s = n.s ++ scaleForm n.form "мільярд" "мільярды" "мільярдаў"} ;
pot5plus n m = {s = (pot5 n).s ++ m.s} ;
pot5decimal d = {s = d.s ++ "мільярда"} ;
IDig d = d ;
IIDig d ds = {s = d.s ++ BIND ++ ds.s} ;
D_0 = {s = "0"} ;
D_1 = {s = "1"} ;
D_2 = {s = "2"} ;
D_3 = {s = "3"} ;
D_4 = {s = "4"} ;
D_5 = {s = "5"} ;
D_6 = {s = "6"} ;
D_7 = {s = "7"} ;
D_8 = {s = "8"} ;
D_9 = {s = "9"} ;
PosDecimal d = d ;
NegDecimal d = {s = "-" ++ BIND ++ d.s} ;
IFrac d dig = {s = d.s ++ "." ++ BIND ++ dig.s} ;
oper
mkDigit : (unit, feminine, teen, ten, hundred : Str) -> NumForm -> {
s, fem, teen, ten, hundred : Str ;
form : NumForm
} = \unit,feminine,teen,ten,hundred,form -> {
s = unit ; fem = feminine ; teen = teen ; ten = ten ;
hundred = hundred ; form = form
} ;
mkNum : Str -> NumForm -> {s, fem, hundred : Str ; form : NumForm} =
\s,form -> {s = s ; fem = s ; hundred = [] ; form = form} ;
scaleForm : NumForm -> (one, few, many : Str) -> Str =
\form,one,few,many -> case form of {
One => one ;
Few => few ;
Many => many
} ;
param
NumForm = One | Few | Many ;
}