just for fun: Roman numbers in the Latin grammar

This commit is contained in:
krasimir
2009-07-31 11:58:22 +00:00
parent 219f19d265
commit 171556dc9a
4 changed files with 50 additions and 54 deletions

View File

@@ -59,7 +59,7 @@ concrete CatLat of Cat = CommonX ** open ResLat, Prelude in {
---- Numeral
--
-- Numeral = {s : CardOrd => Str ; n : Number} ;
-- Digits = {s : CardOrd => Str ; n : Number ; tail : DTail} ;
Digits = {s : Str ; unit : Unit} ;
--
---- Structural
--

View File

@@ -5,7 +5,7 @@ concrete GrammarLat of Grammar =
VerbLat,
AdjectiveLat,
AdverbLat,
-- NumeralLat,
NumeralLat,
SentenceLat,
-- QuestionLat,
-- RelativeLat,

View File

@@ -1,4 +1,4 @@
--concrete NumeralLat of Numeral = CatLat ** open ResLat in {
concrete NumeralLat of Numeral = CatLat ** open ResLat in {
--
--lincat
-- Digit = {s : DForm => CardOrd => Str} ;
@@ -42,54 +42,47 @@
--lin pot3plus n m = {
-- s = \\c => n.s ! NCard ++ "thousand" ++ m.s ! c ; n = Pl} ;
--
---- numerals as sequences of digits
--
-- lincat
-- Dig = TDigit ;
--
-- lin
-- IDig d = d ** {tail = T1} ;
--
-- IIDig d i = {
-- s = \\o => d.s ! NCard ++ commaIf i.tail ++ i.s ! o ;
-- n = Pl ;
-- tail = inc i.tail
-- } ;
--
-- D_0 = mkDig "0" ;
-- D_1 = mk3Dig "1" "1st" Sg ;
-- D_2 = mk2Dig "2" "2nd" ;
-- D_3 = mk2Dig "3" "3rd" ;
-- D_4 = mkDig "4" ;
-- D_5 = mkDig "5" ;
-- D_6 = mkDig "6" ;
-- D_7 = mkDig "7" ;
-- D_8 = mkDig "8" ;
-- D_9 = mkDig "9" ;
--
-- oper
-- commaIf : DTail -> Str = \t -> case t of {
-- T3 => "," ;
-- _ => []
-- } ;
--
-- inc : DTail -> DTail = \t -> case t of {
-- T1 => T2 ;
-- T2 => T3 ;
-- T3 => T1
-- } ;
--
-- mk2Dig : Str -> Str -> TDigit = \c,o -> mk3Dig c o Pl ;
-- mkDig : Str -> TDigit = \c -> mk2Dig c (c + "th") ;
--
-- mk3Dig : Str -> Str -> Number -> TDigit = \c,o,n -> {
-- s = table {NCard => c ; NOrd => o} ;
-- n = n
-- } ;
--
-- TDigit = {
-- n : Number ;
-- s : CardOrd => Str
-- } ;
--
--}
-- 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 "" "" "" "" "" "" ;
D_1 = mkDig "I" "X" "C" "M" "(X)" "(C)" ;
D_2 = mkDig "II" "XX" "CC" "MM" "(XX)" "(CC)" ;
D_3 = mkDig "III" "XXX" "CCC" "MMM" "(XXX)" "(CCC)" ;
D_4 = mkDig "IV" "XL" "CD" "(IV)" "(XL)" "(CD)" ;
D_5 = mkDig "V" "L" "D" "(V)" "(L)" "(D)" ;
D_6 = mkDig "VI" "LX" "DC" "(VI)" "(LX)" "(DC)" ;
D_7 = mkDig "VII" "LXX" "DCC" "(VII)" "(LXX)" "(DCC)" ;
D_8 = mkDig "VIII" "LXXX" "DCCC" "(VIII)" "(LXXX)" "(DCCC)" ;
D_9 = mkDig "IX" "XC" "CM" "(IX)" "(XC)" "(CM)" ;
oper
TDigit = {
s : Unit => Str
} ;
mkDig : Str -> Str -> Str -> Str -> Str -> Str -> TDigit =
\one,ten,hundred,thousand,ten_thousand,hundred_thousand -> {
s = table Unit [one;ten;hundred;thousand;ten_thousand;hundred_thousand]
} ;
inc : Unit -> Unit = \u ->
case u of {
one => ten ;
ten => hundred ;
hundred => thousand ;
thousand => ten_thousand ;
ten_thousand => hundred_thousand ;
hundred_thousand => hundred_thousand
} ;
}

View File

@@ -566,5 +566,8 @@ oper
mkPrep : Str -> Case -> {s : Str ; c : Case} = \s,c -> {s = s ; c = c} ;
param
Unit = one | ten | hundred | thousand | ten_thousand | hundred_thousand ;
}