diff options
| author | aarne <aarne@chalmers.se> | 2010-04-24 11:34:04 +0000 |
|---|---|---|
| committer | aarne <aarne@chalmers.se> | 2010-04-24 11:34:04 +0000 |
| commit | 2b21e7fae764f454200183fdcd7efbed3c647012 (patch) | |
| tree | cd0e931a768f53a69f7c1df206b71317d9b1ce6d /examples/lrec-tutorial/Morpho.gf | |
| parent | 2f62ab26e61584749e7670b2ce9f619ba7802c23 (diff) | |
lrec tutorial examples
Diffstat (limited to 'examples/lrec-tutorial/Morpho.gf')
| -rw-r--r-- | examples/lrec-tutorial/Morpho.gf | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/examples/lrec-tutorial/Morpho.gf b/examples/lrec-tutorial/Morpho.gf new file mode 100644 index 000000000..dfa465483 --- /dev/null +++ b/examples/lrec-tutorial/Morpho.gf @@ -0,0 +1,82 @@ +resource Morpho = open Prelude in { + +param + VForm = VInf | VPres | VPast | VPastPart | VPresPart ; + +oper + Verb : Type = {s : VForm => Str} ; + +-- worst-case function for data abstraction + + mkVerb : (_,_,_,_,_ : Str) -> Verb = \vi,vpr,vpa,vpap,vprp -> { + s = table { + VInf => vi ; + VPres => vpr ; + VPast => vpa ; + VPastPart => vpap ; + VPresPart => vprp + } + } ; + + regVerb : Str -> Verb = \walk -> + mkVerb walk (walk + "s") (walk + "ed") (walk + "ed") (walk + "ing") ; + + s_regVerb : Str -> Verb = \kiss -> + mkVerb kiss (kiss + "es") (kiss + "ed") (kiss + "ed") (kiss + "ing") ; + + e_regVerb : Str -> Verb = \use -> + let us = init use + in + mkVerb use (use + "s") (us + "ed") (us + "ed") (us + "ing") ; + + y_regVerb : Str -> Verb = \cry -> + let cr = init cry + in + mkVerb cry (cr + "ies") (cr + "ied") (cr + "ied") (cry + "ing") ; + + ie_regVerb : Str -> Verb = \die -> + let dy = Predef.tk 2 die + "y" + in + mkVerb die (die + "s") (die + "d") (die + "d") (dy + "ing") ; + + dupRegVerb : Str -> Verb = \stop -> + let stopp = stop + last stop + in + mkVerb stop (stop + "s") (stopp + "ed") (stopp + "ed") (stopp + "ing") ; + + smartVerb : Str -> Verb = \v -> case v of { + _ + ("s"|"z"|"x"|"ch") => s_regVerb v ; + _ + "ie" => ie_regVerb v ; + _ + "ee" => mkVerb v (v + "s") (v + "d") (v + "d") (v + "ing") ; + _ + "e" => e_regVerb v ; + _ + ("a"|"e"|"o"|"u") + "y" => regVerb v ; + _ + "y" => y_regVerb v ; + _ + ("ea"|"ee"|"ie"|"oa"|"oo"|"ou") + ? => regVerb v ; + _ + ("a"|"e"|"i"|"o"|"u") + + ("b"|"d"|"g"|"m"|"n"|"p"|"s"|"t") => dupRegVerb v ; + _ => regVerb v + } ; + + irregVerb : (_,_,_ : Str) -> Verb = \sing,sang,sung -> + let v = smartVerb sing + in + mkVerb sing (v.s ! VPres) sang sung (v.s ! VPresPart) ; + +-- first example of matching + + add_s : Str -> Str = \v -> case v of { + _ + ("s"|"z"|"x"|"ch") => v + "es" ; + _ + ("a"|"e"|"o"|"u") + "y" => v + "s" ; + cr + "y" => cr + "ies" ; + _ => v + "s" + } ; + +-- user paradigm + + mkV = overload { + mkV : (cry : Str) -> Verb = smartVerb ; + mkV : (sing,sang,sung : Str) -> Verb = irregVerb ; + mkV : (go,goes,went,gone,going : Str) -> Verb = mkVerb ; + } ; + +} |
