1 package com.cliffc.aa.HM;
3 import org.junit.Before;
7 import static org.junit.Assert.assertEquals;
13 @Test(expected = RuntimeException.class)
21 assertEquals(
"3",t.
p());
27 assertEquals(
"{ A -> (pair 3 A) }",t.
p());
32 T2 t =
HM7.
hm(
"{ z -> (pair (z 3) (z \"abc\")) }");
33 assertEquals(
"{ { all -> A } -> (pair A A) }",t.
p());
38 T2 t =
HM7.
hm(
"fact = { n -> (if (?0 n) 1 (* n (fact (dec n))))}; fact");
39 assertEquals(
"{ int64 -> int64 }",t.
p());
46 T2 t1 =
HM7.
hm(
"({ x -> (pair (x 3) (x \"abc\")) } {y->y})");
47 assertEquals(
"(pair all all)",t1.
p());
53 T2 t1 =
HM7.
hm(
"{ f -> (f f) }");
54 assertEquals(
"{ A:{ $A -> B } -> B }",t1.
p());
61 T2 t1 =
HM7.
hm(
"g = {f -> 5}; (g g)");
62 assertEquals(
"5",t1.
p());
68 T2 t1 =
HM7.
hm(
"{ g -> f = { x -> g }; (pair (f 3) (f \"abc\"))}");
69 assertEquals(
"{ A -> (pair A A) }",t1.
p());
74 T2 t1 =
HM7.
hm(
"{ f g -> (f g)}");
75 assertEquals(
"{ { A -> B } A -> B }",t1.
p());
81 T2 t1 =
HM7.
hm(
"{ f g -> { arg -> (g (f arg))} }");
82 assertEquals(
"{ { A -> B } { B -> C } -> { A -> C } }",t1.
p());
88 T2 t1 =
HM7.
hm(
"map = { fun -> { x -> 2 } }; ((map 3) 5)");
89 assertEquals(
"2",t1.
p());
95 T2 t1 =
HM7.
hm(
"map = { fun -> { x -> (fun x)}}; { p -> 5 }");
96 assertEquals(
"{ A -> 5 }",t1.
p());
104 T2 t1 =
HM7.
hm(
"map = { fun -> { x -> (fun x)}};"+
105 "(pair ((map str) 5) ((map factor) 2.3))");
106 assertEquals(
"(pair str (divmod flt64 flt64))",t1.
p());
112 T2 t1 =
HM7.
hm(
"map = { fun x -> (fun x)}; (map {a->3} 5)");
113 assertEquals(
"3",t1.
p());
119 T2 t1 =
HM7.
hm(
"map = { fun x -> (fun x)}; (map { a-> (pair a a)} 5)");
120 assertEquals(
"(pair 5 5)",t1.
p());
125 T2 t1 =
HM7.
hm(
"fcn = { p -> { a -> (pair a a) }};"+
126 "map = { fun x -> (fun x)};"+
127 "{ q -> (map (fcn q) 5)}");
128 assertEquals(
"{ A -> (pair 5 5) }",t1.
p());
131 @Test(expected = RuntimeException.class)
144 T2 t1 =
HM7.
hm(
"fcn = {p -> (if p {a -> (pair a a)} {b -> (pair b (pair 3 b))})};"+
145 "map = { fun x -> (fun x)};"+
146 "{ q -> (map (fcn q) 5)}");
147 assertEquals(
"TBD",t1.
p());
152 T2 t1 =
HM7.
hm(
"cons ={x y-> {cadr -> (cadr x y)}};"+
153 "cdr ={mycons -> (mycons { p q -> q})};"+
155 assertEquals(
"3",t1.
p());
167 T2 t1 =
HM7.
hm(
"cons ={x y-> {cadr -> (cadr x y)}};"+
168 "cdr ={mycons -> (mycons { p q -> q})};"+
169 "map ={fun parg -> (fun (cdr parg))};"+
170 "(pair (map str (cons 0 5)) (map isempty (cons 0 \"abc\")))"
172 assertEquals(
"(pair str int1)",t1.
p());
178 T2 t1 =
HM7.
hm(
"f0 = { f x -> (if (?0 x) 1 (f (f0 f (dec x)) 2))}; (f0 * 99)");
179 assertEquals(
"int64",t1.
p());
187 T2 t1 =
HM7.
hm(
"f0 = { f x -> (if (?0 x) 1 (* (f0 f (dec x)) 2))}; (f0 f0 99)");
188 assertEquals(
"int64",t1.
p());
195 " is_odd = { n -> (if (?0 n) 0 (is_even (dec n)))}; "+
196 " { n -> (if (?0 n) 1 (is_odd (dec n)))};"+
199 assertEquals(
"int1",t1.
p());
205 T2 t1 =
HM7.
hm(
"{ g -> fgz = "+
206 " cons = {x y -> {cadr -> (cadr x y)}};"+
207 " cdr = {mycons -> (mycons { p q -> q})};"+
208 " (cdr (cons 2 { z -> (g z) }));"+
209 " (pair (fgz 3) (fgz 5))"+
212 assertEquals(
"{ { nint8 -> A } -> (pair A A) }",t1.
p());
219 assertEquals(
"@{ x = 2, y = 3}",t.
p());
225 T2 t =
HM7.
hm(
".x @{x =2, y =3}");
226 assertEquals(
"2",t.
p());
231 T2 t =
HM7.
hm(
"{ g -> @{x=g, y=g}}");
232 assertEquals(
"{ A -> @{ x = A, y = A} }",t.
p());
238 T2 t =
HM7.
hm(
"{ pred -> .x (if pred @{x=2,y=3} @{x=3,z= \"abc\"}) }");
239 assertEquals(
"{ A -> nint8 }",t.
p());
246 T2 t =
HM7.
hm(
"{ sq -> (* .x sq .y sq) }");
247 assertEquals(
"{ @{ y = int64, x = int64} -> int64 }",t.
p());
253 T2 t =
HM7.
hm(
"map = { fcn lst -> @{ n1 = (map fcn .n0 lst), v1 = (fcn .v0 lst) } }; map");
254 assertEquals(
"{ { A -> B } C:@{ v0 = A, n0 = $C} -> D:@{ n1 = $D, v1 = B} }",t.
p());
260 T2 t =
HM7.
hm(
"map = { fcn lst -> (if lst @{ n1=(map fcn .n0 lst), v1=(fcn .v0 lst) } nil) }; map");
261 assertEquals(
"{ { A -> B } C:@{ v0 = A, n0 = $C}? -> D:@{ n1 = $D, v1 = B}? }",t.
p());
268 T2 t =
HM7.
hm(
"p0 = { x y z -> (triple x y z) };"+
269 "p1 = (triple p0 p0 p0);"+
270 "p2 = (triple p1 p1 p1);"+
271 "p3 = (triple p2 p2 p2);"+
273 assertEquals(
"(triple (triple (triple { A B C -> (triple A B C) } { D E F -> (triple D E F) } { G H I -> (triple G H I) }) (triple { J K L -> (triple J K L) } { M N O -> (triple M N O) } { P Q R -> (triple P Q R) }) (triple { S T U -> (triple S T U) } { V21 V22 V23 -> (triple V21 V22 V23) } { V24 V25 V26 -> (triple V24 V25 V26) })) (triple (triple { V27 V28 V29 -> (triple V27 V28 V29) } { V30 V31 V32 -> (triple V30 V31 V32) } { V33 V34 V35 -> (triple V33 V34 V35) }) (triple { V36 V37 V38 -> (triple V36 V37 V38) } { V39 V40 V41 -> (triple V39 V40 V41) } { V42 V43 V44 -> (triple V42 V43 V44) }) (triple { V45 V46 V47 -> (triple V45 V46 V47) } { V48 V49 V50 -> (triple V48 V49 V50) } { V51 V52 V53 -> (triple V51 V52 V53) })) (triple (triple { V54 V55 V56 -> (triple V54 V55 V56) } { V57 V58 V59 -> (triple V57 V58 V59) } { V60 V61 V62 -> (triple V60 V61 V62) }) (triple { V63 V64 V65 -> (triple V63 V64 V65) } { V66 V67 V68 -> (triple V66 V67 V68) } { V69 V70 V71 -> (triple V69 V70 V71) }) (triple { V72 V73 V74 -> (triple V72 V73 V74) } { V75 V76 V77 -> (triple V75 V76 V77) } { V78 V79 V80 -> (triple V78 V79 V80) })))",t.
p());
281 T2 t =
HM7.
hm(
"map = { lst -> (if lst @{ n1= arg= .n0 lst; (if arg @{ n1=(map .n0 arg), v1=(str .v0 arg)} nil), v1=(str .v0 lst) } nil) }; map");
282 assertEquals(
"{ A:@{ v0 = int64, n0 = @{ n0 = $A, v0 = int64}?}? -> B:@{ n1 = @{ n1 = $B, v1 = str}?, v1 = str}? }",t.
p());