1 package com.cliffc.aa.HM;
4 import org.junit.Before;
8 import static org.junit.Assert.assertEquals;
14 @Test(expected = RuntimeException.class)
16 Syntax syn =
new Ident(
"fred");
24 assertEquals(
"3",t.
p());
29 Syntax syn =
new Apply(
new Ident(
"pair1"),
new Con(
TypeInt.
con(3)));
31 assertEquals(
"{ V24 -> (pair 3 V24) }",t.
p());
39 new Apply(
new Ident(
"pair"),
40 new Apply(
new Ident(
"z"),
new Con(
TypeInt.
con(3))),
41 new Apply(
new Ident(
"z"),
new Con(
TypeStr.
ABC))));
43 assertEquals(
"{ { all -> V23 } -> (pair V23 V23) }",t.
p());
52 new Apply(
new Ident(
"if/else"),
53 new Apply(
new Ident(
"==0"),
new Ident(
"n")),
55 new Apply(
new Ident(
"*"),
57 new Apply(
new Ident(
"fact"),
58 new Apply(
new Ident(
"dec"),
new Ident(
"n")))))),
61 assertEquals(
"{ int64 -> int64 }",t.
p());
70 new Apply(
new Lambda(
"x",
71 new Apply(
new Ident(
"pair"),
72 new Apply(
new Ident(
"x"),
new Con(
TypeInt.
con(3))),
73 new Apply(
new Ident(
"x"),
new Con(
TypeStr.
ABC)))),
74 new Lambda(
"y",
new Ident(
"y")));
77 assertEquals(
"(pair all all)",t1.
p());
85 new Lambda(
"f",
new Apply(
new Ident(
"f"),
new Ident(
"f")));
87 assertEquals(
"{ $25:{ $25 -> V21 } -> V21 }",t1.
p());
98 new Apply(
new Ident(
"g"),
new Ident(
"g")));
100 assertEquals(
"5",t1.
p());
110 new Lambda(
"x",
new Ident(
"g")),
111 new Apply(
new Ident(
"pair"),
112 new Apply(
new Ident(
"f"),
new Con(
TypeInt.
con(3))),
113 new Apply(
new Ident(
"f"),
new Con(
TypeInt.
con(1))))));
115 assertEquals(
"{ V2 -> (pair V2 V2) }",t1.
p());
122 new Lambda2(
"f",
"g",
new Apply(
new Ident(
"f"),
new Ident(
"g")));
124 assertEquals(
"{ { V1 -> V22 } V1 -> V22 }",t1.
p());
132 new Lambda2(
"f",
"g",
new Lambda(
"arg",
new Apply(
new Ident(
"g"),
new Apply(
new Ident(
"f"),
new Ident(
"arg")))));
134 assertEquals(
"{ { V0 -> V26 } { V26 -> V24 } -> { V0 -> V24 } }",t1.
p());
147 new Apply(
new Apply(
new Ident(
"map"),
151 assertEquals(
"2",t1.
p());
163 new Apply(
new Ident(
"fun"),
new Ident(
"x")))),
167 assertEquals(
"{ V2 -> 5 }",t1.
p());
181 new Apply(
new Ident(
"fun"),
new Ident(
"x")))),
182 new Apply(
new Ident(
"pair"),
183 new Apply(
new Apply(
new Ident(
"map"),
new Ident(
"str")),
185 new Apply(
new Apply(
new Ident(
"map"),
new Ident(
"factor")),
189 assertEquals(
"(pair str (divmod flt64 flt64))",t1.
p());
201 new Apply(
new Ident(
"fun"),
new Ident(
"x")))),
202 new Apply(
new Apply(
new Ident(
"map"),
206 assertEquals(
"3",t1.
p());
218 new Apply(
new Ident(
"fun"),
new Ident(
"x")))),
219 new Apply(
new Apply(
new Ident(
"map"),
221 new Apply(
new Ident(
"pair"),
226 assertEquals(
"(pair 5 5)",t1.
p());
240 new Apply(
new Ident(
"pair"),
244 new Lambda2(
"fun",
"x",
new Apply(
new Ident(
"fun"),
new Ident(
"x"))),
246 new Apply(
new Ident(
"map"),
247 new Apply(
new Ident(
"fcn"),
new Ident(
"q")),
250 assertEquals(
"{ V4 -> (pair 5 5) }",t1.
p());
253 @Test(expected = RuntimeException.class)
268 new Apply(
new Ident(
"if/else"),
271 new Apply(
new Ident(
"pair"),
275 new Apply(
new Ident(
"pair"),
277 new Apply(
new Ident(
"pair"),
281 new Lambda2(
"fun",
"x",
new Apply(
new Ident(
"fun"),
new Ident(
"x"))),
283 new Apply(
new Ident(
"map"),
284 new Apply(
new Ident(
"fcn"),
new Ident(
"q")),
288 assertEquals(
"TBD",t1.
p());
298 new Let(
"cons",
new Lambda2(
"x",
"y",
299 new Lambda(
"cadr",
new Apply(
new Ident(
"cadr"),
new Ident(
"x"),
new Ident(
"y")))),
300 new Let(
"cdr",
new Lambda(
"mycons",
new Apply(
new Ident(
"mycons"),
new Lambda2(
"p",
"q",
new Ident(
"q")))),
301 new Apply(
new Ident(
"cdr"),
304 assertEquals(
"3",t1.
p());
317 new Let(
"cons",
new Lambda2(
"x",
"y",
318 new Lambda(
"cadr",
new Apply(
new Ident(
"cadr"),
new Ident(
"x"),
new Ident(
"y")))),
319 new Let(
"cdr",
new Lambda(
"mycons",
new Apply(
new Ident(
"mycons"),
new Lambda2(
"p",
"q",
new Ident(
"q")))),
321 new Lambda2(
"fun",
"parg",
322 new Apply(
new Ident(
"fun"),
323 new Apply(
new Ident(
"cdr"),
new Ident(
"parg"))
326 new Apply(
new Ident(
"pair"),
327 new Apply(
new Ident(
"map"),
new Ident(
"str" ), (
new Apply(
new Ident(
"cons"),
new Con(
TypeInt.
BOOL),
new Con(
TypeInt.
con(5))))),
328 new Apply(
new Ident(
"map"),
new Ident(
"isempty"), (
new Apply(
new Ident(
"cons"),
new Con(
TypeInt.
BOOL),
new Con(
TypeStr.
ABC ))))
331 assertEquals(
"(pair str int1)",t1.
p());
339 new Let(
"f0",
new Lambda2(
"f",
"x",
340 new Apply(
new Ident(
"if/else"),
341 new Apply(
new Ident(
"==0"),
new Ident(
"x")),
343 new Apply(
new Ident(
"f"),
344 new Apply(
new Ident(
"f0"),
346 new Apply(
new Ident(
"dec"),
new Ident(
"x"))),
350 new Apply(
new Ident(
"f0"),
new Ident(
"*"),
new Con(
TypeInt.
con(99))));
352 assertEquals(
"int64",t1.
p());
362 new Let(
"f0",
new Lambda2(
"f",
"x",
363 new Apply(
new Ident(
"if/else"),
364 new Apply(
new Ident(
"==0"),
new Ident(
"x")),
366 new Apply(
new Ident(
"*"),
367 new Apply(
new Ident(
"f0"),
369 new Apply(
new Ident(
"dec"),
new Ident(
"x"))),
373 new Apply(
new Ident(
"f0"),
new Ident(
"f0"),
new Con(
TypeInt.
con(99))));
375 assertEquals(
"int64",t1.
p());
386 Syntax x =
new Let(
"is_even",
389 new Apply(
new Ident(
"if/else"),
390 new Apply(
new Ident(
"==0"),
new Ident(
"n")),
392 new Apply(
new Ident(
"is_even"),
393 new Apply(
new Ident(
"dec"),
new Ident(
"n"))))),
395 new Apply(
new Ident(
"if/else"),
396 new Apply(
new Ident(
"==0"),
new Ident(
"n")),
398 new Apply(
new Ident(
"is_odd" ),
399 new Apply(
new Ident(
"dec"),
new Ident(
"n")))))
401 new Apply(
new Ident(
"is_even"),
new Con(
TypeInt.
con(3))));
403 assertEquals(
"int1",t1.
p());
421 new Lambda2(
"x",
"y",
new Lambda(
"cadr",
new Apply(
new Ident(
"cadr"),
new Ident(
"x"),
new Ident(
"y")))),
423 new Lambda(
"mycons",
new Apply(
new Ident(
"mycons"),
new Lambda2(
"p",
"q",
new Ident(
"q")))),
424 new Apply(
new Ident(
"cdr"),
425 new Apply(
new Ident(
"cons"),
427 new Lambda(
"z",
new Apply(
new Ident(
"g"),
new Ident(
"z"))))))),
428 new Apply(
new Ident(
"pair"),
429 new Apply(
new Ident(
"fgz"),
new Con(
TypeInt.
con(3))),
430 new Apply(
new Ident(
"fgz"),
new Con(
TypeInt.
con(5))))));
432 assertEquals(
"{ { nint8 -> V33 } -> (pair V33 V33) }",t1.
p());