aa
TestHM6.java
Go to the documentation of this file.
1 package com.cliffc.aa.HM;
2 
3 import com.cliffc.aa.type.*;
4 import org.junit.Before;
5 import org.junit.Test;
6 
7 import static com.cliffc.aa.HM.HM6.*;
8 import static org.junit.Assert.assertEquals;
9 
10 public class TestHM6 {
11 
12  @Before public void reset() { HM.reset(); }
13 
14  @Test(expected = RuntimeException.class)
15  public void test00() {
16  HM6.hm("fred");
17  }
18 
19  @Test
20  public void test01() {
21  Syntax syn = new Con(TypeInt.con(3));
22  T2 t = HM6.hm("3");
23  assertEquals("3",t.p());
24  }
25 
26  @Test
27  public void test02() {
28  T2 t = HM6.hm("(pair1 3)");
29  assertEquals("{ V24 -> (pair 3 V24) }",t.p());
30  }
31 
32  @Test
33  public void test03() {
34  T2 t = HM6.hm("{ z -> (pair (z 3) (z \"abc\")) }");
35  assertEquals("{ { all -> V23 } -> (pair V23 V23) }",t.p());
36  }
37 
38  @Test
39  public void test04() {
40  T2 t = HM6.hm("fact = { n -> (if/else (==0 n) 1 (* n (fact (dec n))))}; fact");
41  assertEquals("{ int64 -> int64 }",t.p());
42  }
43 
44  @Test
45  public void test05() {
46  // Because {y->y} is passed in, all 'y' types must agree.
47  // This unifies 3 and "abc" which results in 'all'
48  T2 t1 = HM6.hm("({ x -> (pair (x 3) (x \"abc\")) } {y->y})");
49  assertEquals("(pair all all)",t1.p());
50  }
51 
52  @Test//(expected = RuntimeException.class) No longer throws, but returns a recursive type
53  public void test06() {
54  // recursive unification
55  T2 t1 = HM6.hm("{ f -> (f f) }");
56  assertEquals("{ $25:{ $25 -> V21 } -> V21 }",t1.p());
57  // We can argue the pretty-print should print:
58  // "$26:{ $26 -> V21 }"
59  }
60 
61  @Test
62  public void test07() {
63  T2 t1 = HM6.hm("g = {f -> 5}; (g g)");
64  assertEquals("5",t1.p());
65  }
66 
67  @Test
68  public void test08() {
69  // example that demonstrates generic and non-generic variables:
70  T2 t1 = HM6.hm("{ g -> f = { x -> g }; (pair (f 3) (f \"abc\"))}");
71  assertEquals("{ V21 -> (pair V21 V21) }",t1.p());
72  }
73 
74  @Test
75  public void test09() {
76  T2 t1 = HM6.hm("{ f g -> (f g)}");
77  assertEquals("{ { V20 -> V22 } V20 -> V22 }",t1.p());
78  }
79 
80  @Test
81  public void test10() {
82  // Function composition
83  T2 t1 = HM6.hm("{ f g -> { arg -> (g (f arg))} }");
84  assertEquals("{ { V19 -> V26 } { V26 -> V24 } -> { V19 -> V24 } }",t1.p());
85  }
86 
87  @Test
88  public void test11() {
89  // Stacked functions ignoring all function arguments
90  T2 t1 = HM6.hm("map = { fun -> { x -> 2 } }; ((map 3) 5)");
91  assertEquals("2",t1.p());
92  }
93 
94  @Test
95  public void test12() {
96  // map takes a function and an element (collection?) and applies it (applies to collection?)
97  T2 t1 = HM6.hm("map = { fun -> { x -> (fun x)}}; { p -> 5 }");
98  assertEquals("{ V21 -> 5 }",t1.p());
99  }
100 
101  @Test
102  public void test13() {
103  // Looking at when tvars are duplicated ("fresh" copies made).
104  // This is the "map" problem with a scalar instead of a collection.
105  // Takes a '{a->b}' and a 'a' for a couple of different prims.
106  T2 t1 = HM6.hm("map = { fun -> { x -> (fun x)}};"+
107  "(pair ((map str) 5) ((map factor) 2.3))");
108  assertEquals("(pair str (divmod flt64 flt64))",t1.p());
109  }
110 
111  @Test
112  public void test14() {
113  // map takes a function and an element (collection?) and applies it (applies to collection?)
114  T2 t1 = HM6.hm("map = { fun x -> (fun x)}; (map {a->3} 5)");
115  assertEquals("3",t1.p());
116  }
117 
118  @Test
119  public void test15() {
120  // map takes a function and an element (collection?) and applies it (applies to collection?)
121  T2 t1 = HM6.hm("map = { fun x -> (fun x)}; (map { a-> (pair a a)} 5)");
122  assertEquals("(pair 5 5)",t1.p());
123  }
124 
125  @Test
126  public void test16() {
127  T2 t1 = HM6.hm("fcn = { p -> { a -> (pair a a) }};"+
128  "map = { fun x -> (fun x)};"+
129  "{ q -> (map (fcn q) 5)}");
130  assertEquals("{ V23 -> (pair 5 5) }",t1.p());
131  }
132 
133  @Test(expected = RuntimeException.class)
134  public void test17() {
135  // Checking behavior when using "if/else" to merge two functions with
136  // sufficiently different signatures, then attempting to pass them to a map
137  // & calling internally.
138  // fcn takes a predicate 'p' and returns one of two fcns.
139  // let fcn = { p -> (if/else p {a -> pair[a,a ]}
140  // {b -> pair[b,pair[3,b]]}) } in
141  // map takes a function and an element (collection?) and applies it (applies to collection?)
142  // let map = { fun x -> (fun x) }
143  // in { q -> ((map (fcn q)) 5) }
144  // Should return { q -> q ? [5,5] : [5,[3,5]] }
145  // Ultimately, unifies "a" with "pair[3,a]" which throws recursive unification.
146  T2 t1 = HM6.hm("fcn = {p -> (if/else p {a -> (pair a a)} {b -> (pair b (pair 3 b))})};"+
147  "map = { fun x -> (fun x)};"+
148  "{ q -> (map (fcn q) 5)}");
149  assertEquals("TBD",t1.p());
150  }
151 
152  @Test
153  public void test18() {
154  T2 t1 = HM6.hm("cons ={x y-> {cadr -> (cadr x y)}};"+
155  "cdr ={mycons -> (mycons { p q -> q})};"+
156  "(cdr (cons 2 3))");
157  assertEquals("3",t1.p());
158  }
159 
160  // Take 2nd element of pair, and applies a function.
161  // let map = fn parg fun => (fun (cdr parg))
162  // Some pairs:
163  // let intz = (pair2 false 3)
164  // let strz = (pair2 false "abc")
165  // in pair(map(str,intz),map(isempty,strz))
166  // Expects: ("2",false)
167  @Test
168  public void test19() {
169  T2 t1 = HM6.hm("cons ={x y-> {cadr -> (cadr x y)}};"+
170  "cdr ={mycons -> (mycons { p q -> q})};"+
171  "map ={fun parg -> (fun (cdr parg))};"+
172  "(pair (map str (cons 0 5)) (map isempty (cons 0 \"abc\")))"
173  );
174  assertEquals("(pair str int1)",t1.p());
175  }
176 
177  // Obscure factorial-like
178  @Test
179  public void test20() {
180  T2 t1 = HM6.hm("f0 = { f x -> (if/else (==0 x) 1 (f (f0 f (dec x)) 2))}; (f0 * 99)");
181  assertEquals("int64",t1.p());
182  }
183 
184  // Obscure factorial-like
185  @Test
186  public void test21() {
187  // let f0 = fn f x => (if/else (==0 x) 1 (* (f0 f (dec x)) 2) ) in f0 f0 99
188  // let f0 = fn f x => (if/else (==0 x) 1 (f (f0 f (dec x)) 2) ) in f0 * 99
189  T2 t1 = HM6.hm("f0 = { f x -> (if/else (==0 x) 1 (* (f0 f (dec x)) 2))}; (f0 f0 99)");
190  assertEquals("int64",t1.p());
191  }
192 
193  // Mutual recursion
194  @Test
195  public void test22() {
196  T2 t1 = HM6.hm("is_even = "+
197  " is_odd = { n -> (if/else (==0 n) 0 (is_even (dec n)))}; "+
198  " { n -> (if/else (==0 n) 1 (is_odd (dec n)))};"+
199  "(is_even 3)"
200  );
201  assertEquals("int1",t1.p());
202  }
203 
204  // Toss a function into a pair & pull it back out
205  @Test
206  public void test23() {
207  T2 t1 = HM6.hm("{ g -> fgz = "+
208  " cons = {x y -> {cadr -> (cadr x y)}};"+
209  " cdr = {mycons -> (mycons { p q -> q})};"+
210  " (cdr (cons 2 { z -> (g z) }));"+
211  " (pair (fgz 3) (fgz 5))"+
212  "}"
213  );
214  assertEquals("{ { nint8 -> V44 } -> (pair V44 V44) }",t1.p());
215  }
216 
217 }
com.cliffc.aa.HM.TestHM6.test16
void test16()
Definition: TestHM6.java:126
com.cliffc.aa.HM.TestHM6.test03
void test03()
Definition: TestHM6.java:33
com.cliffc.aa.HM.TestHM6.test11
void test11()
Definition: TestHM6.java:88
com.cliffc.aa.HM.HM7.T2.p
String p()
Definition: HM7.java:1082
com.cliffc
com.cliffc.aa.HM.TestHM6.test02
void test02()
Definition: TestHM6.java:27
com.cliffc.aa.type.TypeInt
Definition: TypeInt.java:9
com.cliffc.aa.HM.TestHM6.test05
void test05()
Definition: TestHM6.java:45
com.cliffc.aa.HM.TestHM6.test22
void test22()
Definition: TestHM6.java:195
com.cliffc.aa.HM.TestHM6
Definition: TestHM6.java:10
com.cliffc.aa.HM.TestHM6.test04
void test04()
Definition: TestHM6.java:39
com.cliffc.aa.type.TypeInt.con
static TypeInt con(long con)
Definition: TypeInt.java:37
com.cliffc.aa.HM.HM
Definition: HM.java:84
Test
com.cliffc.aa.HM.TestHM6.test14
void test14()
Definition: TestHM6.java:112
com.cliffc.aa.HM.TestHM6.test19
void test19()
Definition: TestHM6.java:168
com.cliffc.aa.HM.TestHM6.test18
void test18()
Definition: TestHM6.java:153
com.cliffc.aa.HM.HM6
Definition: HM6.java:23
com.cliffc.aa.HM.TestHM6.test15
void test15()
Definition: TestHM6.java:119
com.cliffc.aa.HM.TestHM6.test23
void test23()
Definition: TestHM6.java:206
com.cliffc.aa.HM.TestHM6.test12
void test12()
Definition: TestHM6.java:95
com.cliffc.aa.HM.HM6.hm
static T2 hm(String sprog)
Definition: HM6.java:27
com.cliffc.aa.HM.HM7.T2
Definition: HM7.java:621
com.cliffc.aa.HM.TestHM6.test10
void test10()
Definition: TestHM6.java:81
com.cliffc.aa.HM.TestHM6.test07
void test07()
Definition: TestHM6.java:62
com.cliffc.aa.HM.TestHM6.test13
void test13()
Definition: TestHM6.java:102
com.cliffc.aa.HM.TestHM6.test01
void test01()
Definition: TestHM6.java:20
com.cliffc.aa.HM.TestHM6.test20
void test20()
Definition: TestHM6.java:179
com.cliffc.aa.HM.TestHM6.test09
void test09()
Definition: TestHM6.java:75
com.cliffc.aa
Definition: AA.java:1
com.cliffc.aa.HM.TestHM6.test21
void test21()
Definition: TestHM6.java:186
com.cliffc.aa.HM.TestHM6.test17
void test17()
Definition: TestHM6.java:134
com.cliffc.aa.HM
Definition: HM.java:1
com.cliffc.aa.HM.TestHM6.reset
void reset()
Definition: TestHM6.java:12
com.cliffc.aa.HM.TestHM6.test08
void test08()
Definition: TestHM6.java:68
com
com.cliffc.aa.HM.HM.reset
static void reset()
Definition: HM.java:143
com.cliffc.aa.HM.TestHM6.test00
void test00()
Definition: TestHM6.java:15
com.cliffc.aa.HM.TestHM6.test06
void test06()
Definition: TestHM6.java:53
com.cliffc.aa.type
Definition: Bits.java:1