2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
..
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
..
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
"verve"; "pulchritude"; "beneficence"; "dismay"; "wit";
"cheer"; "glee"; "malevolence"; "wickedness"; "cruelty";
"sagacity"; "splendor"; "pride"; "rage"; "fury"; "snazz";
"foolishness"; "sleepiness"; "curiosity"; "brevity"; "lust";
"confidence"; "bashfulness"; "awkwardness"; "terror";
"accuracy"; "insanity"; "sorrow"; "gladness"; "weariness";
"depression"; "passion"; "dread"; "popularity"; "vulgarity";
"madness"; "compassion"; "tact";
|]
let mods = [|
"filled"; "overcome"; "shining"; "vivacious";
"burning"; "blazing"; "morose"; "gleeful"; "mad";
"shaking"; "howling"; "snarling"; "gruesome";
"helpless"; "vibrant"; "desperate"; "triumphant";
"glum"; "sorrowful"; "struck";
|]
let advs = [|
"cruelly"; "angrily"; "madly"; "hopelessly"; "thoughtlessly";
"wickedly"; "hopefully"; "quickly"; "speedily"; "furiously";
"kindly"; "maniacally"; "tearfully"; "bashfully"; "angrily";
"wondrously"; "splendidly"; "tremendously"; "badly";
"terribly"; "foolishly"; "snazzily"; "toplessly"; "balefully";
"beautifully"; "kindly"; "thoughtfully"; "cautiously";
"severely"; "wisely"; "lustfully"; "tactfully";
|]
let adjs = [|
"cheerful"; "wondrous"; "overwhelming"; "adorable";
"snazzy"; "hopeful"; "desperate"; "lustful"; "dour";
"sad"; "sorrowful"; "hopeless"; "all-consuming"; "mad";
"cruel"; "dreadful"; "terrible"; "fearsome"; "inescapable";
"thoughtless"; "vile"; "bashful"; "topless"; "naked"; "dire";
"baleful"; "vulgar"; "beautiful"; "horrid"; "cautious";
"violent"; "wise"; "supreme"; "marvelous"; "tactful";
|]
let verbs = [|
"shines"; "toots"; "honks"; "mutters"; "whispers"; "growls";
"roars"; "whuffles"; "warbles"; "howls"; "screams"; "shrieks";
"quivers"; "dances"; "hops up and down"; "grins"; "mumbles";
"counsels you"; "glares"; "stares at you"; "looks up"; "gazes at you";
"marvels"; "laughs"; "sins"; "whistles"; "whungles"; "jangles";
"twerks"; "blinks"; "blorps"; "flunks"; "planks"; "glitters";
"gleams"; "grumbles"; "grouches"; "bites you"; "gnaws on you";
"glimmers"; "gripes"; "plots"; "wonders"; "whittles"; "plays the fiddle";
"ponders"; "contemplates you"; "scrunches"; "zaps"; "zaps you";
|]
let pick a = a.(Random.int (Array.length a))
type rule = R of string array | S of string | B of rule list | A of rule array | O of rule;;
let rec eval r : string = match r with
| R x -> pick x
| S x -> x
| B x -> List.fold_left (^) "" (List.map eval x)
| A x -> eval (pick x)
| O x -> if Random.int 2 = 0 then eval x else ""
let syl () =
................................................................................
let obs = A [| stop; fric; vstop; nasal; liq; |] in
let v = R [| "a"; "e"; "u"; "o"; "i"; "ee"; "oo"; "au"; "ai";"oi";|] in
let sr = A [|
B[obs; v; O obs];
B[A [|stop;vstop;fric;vfric;|]; O liq; v; O obs];
|] in eval sr
;;
let prefixes = [| "ur-"; "dire "; "dire ur-"; "super "; "ultra "; "great "; "grand "; "terror-"; "horror-"; "giant "; "evil "; "dark ";|]
let name () =
let size = 1 + (Random.int 3) in
let rec loop n acc = if n = 0 then acc else loop (n-1) (acc^(syl ())) in
(if Random.int 2 = 0 then (pick prefixes) else "") ^ loop size "";;
let isvowel c = match c with
| 'a' | 'e' | 'i' | 'o' | 'u' -> true
................................................................................
"egads!";
"how wondrous!";
"how marvelous!";
"how gruesome!";
"how splendid!";
"oh no!";
|] in
let kinds = B [
R [|"it";"she";"he";|]; S" ";
A [|
B[ R verbs; S " ";
A [|
B[ S "with "; O(B[R adjs; S" "]); R nouns;];
R advs;
|];
];
B[S"is "; O(B[R advs;S " ";]); R mods;
O(B[ S " with "; O(B[R adjs; S" "]); R nouns;]);
];
|];
S "!";
] in
(pick msgs)^" "^(indef (name()))^"! " ^ (eval kinds);;
let rec times n a = if n = 0 then () else (a (); times (n-1) a);;
let () = Random.self_init ();
(* times 20 (fun () ->*)
print_string ((encounter ()) ^ "\n")
(* )*)
|
|
>
|
|
>
>
>
>
>
>
|
>
>
|
>
>
>
>
>
>
|
>
>
>
>
<
|
|
>
>
|
<
>
|
|
>
>
>
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
..
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
...
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
"verve"; "pulchritude"; "beneficence"; "dismay"; "wit";
"cheer"; "glee"; "malevolence"; "wickedness"; "cruelty";
"sagacity"; "splendor"; "pride"; "rage"; "fury"; "snazz";
"foolishness"; "sleepiness"; "curiosity"; "brevity"; "lust";
"confidence"; "bashfulness"; "awkwardness"; "terror";
"accuracy"; "insanity"; "sorrow"; "gladness"; "weariness";
"depression"; "passion"; "dread"; "popularity"; "vulgarity";
"madness"; "compassion"; "tact"; "evil"; "hate"; "hatred";
"horror"; "omnipotence"; "charisma"; "radiance"; "depravity";
|]
let mods_w = [|
"filled"; "overcome"; "shining"; "vivacious";
"burning"; "blazing"; "morose"; "gleeful"; "mad";
"shaking"; "howling"; "snarling"; "gruesome";
"helpless"; "vibrant"; "desperate"; "triumphant";
"glum"; "sorrowful"; "struck"; "grumbling";
"griping"; "hissing"; "hooting"; "crackling";
"glowing"; "radiant";
|]
let mods_f = [|
"full of"; "struck by"; "overcome by";
|]
let mods = Array.append (Array.map (fun a -> a ^ " with") mods_w) mods_f
let advs = [|
"cruelly"; "angrily"; "madly"; "hopelessly"; "thoughtlessly";
"wickedly"; "hopefully"; "quickly"; "speedily"; "furiously";
"kindly"; "maniacally"; "tearfully"; "bashfully"; "angrily";
"wondrously"; "splendidly"; "tremendously"; "badly";
"terribly"; "foolishly"; "snazzily"; "toplessly"; "balefully";
"beautifully"; "kindly"; "thoughtfully"; "cautiously";
"severely"; "wisely"; "lustfully"; "tactfully"; "winsomely";
"watchfully"; "irresponsibly"; "headlessly"; "charismatically";
"radiantly"; "sinfully"; "lawlessly"; "unlawfully"; "lawfully";
|]
let adjs = [|
"cheerful"; "wondrous"; "overwhelming"; "adorable";
"snazzy"; "hopeful"; "desperate"; "lustful"; "dour";
"sad"; "sorrowful"; "hopeless"; "all-consuming"; "mad";
"cruel"; "dreadful"; "terrible"; "fearsome"; "inescapable";
"thoughtless"; "vile"; "bashful"; "topless"; "naked"; "dire";
"baleful"; "vulgar"; "beautiful"; "horrid"; "cautious";
"violent"; "wise"; "supreme"; "marvelous"; "tactful"; "evil";
"wretched"; "fearful"; "awe-inspiring"; "vengeful"; "wrathful";
"omnipotent"; "charismatic"; "radiant"; "lawless"; "unlawful";
"lawful";
|]
type rule = R of string array | S of string | B of rule list | A of rule array | O of rule;;
let mkb = Array.map (fun a -> S a)
let verbs = Array.append (mkb [|
"shines"; "toots"; "honks"; "mutters"; "whispers"; "growls";
"roars"; "whuffles"; "warbles"; "howls"; "screams"; "shrieks";
"quivers"; "dances"; "hops up and down"; "grins"; "mumbles";
"counsels you"; "glares"; "stares at you"; "looks up"; "gazes at you";
"marvels"; "laughs"; "sins"; "whistles"; "whungles"; "jangles";
"twerks"; "blinks"; "blorps"; "flunks"; "planks"; "glitters";
"gleams"; "grumbles"; "grouches"; "bites you"; "gnaws on you";
"glimmers"; "gripes"; "plots"; "wonders"; "whittles"; "plays the fiddle";
"ponders"; "contemplates you"; "scrunches"; "zaps"; "zaps you";
"hoots"; "crackles"; "glows"; "blogs";
|]) [|
B[S"radiates "; R nouns];
B[S"oozes "; R nouns];
|]
let pick a = a.(Random.int (Array.length a))
let rec eval r : string = match r with
| R x -> pick x
| S x -> x
| B x -> List.fold_left (^) "" (List.map eval x)
| A x -> eval (pick x)
| O x -> if Random.int 2 = 0 then eval x else ""
let syl () =
................................................................................
let obs = A [| stop; fric; vstop; nasal; liq; |] in
let v = R [| "a"; "e"; "u"; "o"; "i"; "ee"; "oo"; "au"; "ai";"oi";|] in
let sr = A [|
B[obs; v; O obs];
B[A [|stop;vstop;fric;vfric;|]; O liq; v; O obs];
|] in eval sr
;;
let prefixes = [| "ur-"; "dire "; "dire ur-"; "super "; "ultra "; "great "; "grand "; "terror-"; "horror-"; "giant "; "evil "; "dark "; "vorpal "; "royal ";|]
let name () =
let size = 1 + (Random.int 3) in
let rec loop n acc = if n = 0 then acc else loop (n-1) (acc^(syl ())) in
(if Random.int 2 = 0 then (pick prefixes) else "") ^ loop size "";;
let isvowel c = match c with
| 'a' | 'e' | 'i' | 'o' | 'u' -> true
................................................................................
"egads!";
"how wondrous!";
"how marvelous!";
"how gruesome!";
"how splendid!";
"oh no!";
|] in
let kinds =
let maybe x = O(B[x; S" "]) in
let adjp = B[maybe (R advs); R adjs] in B [
R [|"it";"she";"he";|]; S" ";
A [|
B[A verbs; S " ";
A [|
B[ S "with "; maybe adjp; R nouns;];
R advs;
|];
];
B[S"is "; maybe (R advs);
A [|
B[R mods; S" "; maybe adjp; R nouns;];
R mods_w;
|]
];
|];
S "!";
] in
(pick msgs)^" "^(indef (name()))^"! " ^ (eval kinds);;
let rec times n a = if n = 0 then () else (a (); times (n-1) a);;
let () = Random.self_init ();
(* times 20 (fun () ->*)
print_string ((encounter ()) ^ "\n")
(* )*)
|