1
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
|
#include <metalang99/assert.h>
#include <metalang99/either.h>
#include <metalang99/nat.h>
int main(void) {
#define MATCH_IMPL(either) ML99_match(v(either), v(MATCH_))
#define MATCH_left_IMPL(x) v(ML99_ASSERT_UNEVAL(x == 18))
#define MATCH_right_IMPL(x) v(ML99_ASSERT_UNEVAL(x == 4))
// Pattern matching
{
ML99_EVAL(ML99_call(MATCH, ML99_left(v(18))));
ML99_EVAL(ML99_call(MATCH, ML99_right(v(4))));
}
#undef MATCH_IMPL
#undef MATCH_left_IMPL
#undef MATCH_right_IMPL
#define VAL v(abc ? +-148 % "hello world")
// ML99_isLeft
{
ML99_ASSERT(ML99_isLeft(ML99_left(VAL)));
ML99_ASSERT(ML99_not(ML99_isLeft(ML99_right(VAL))));
}
// ML99_IS_LEFT
{
ML99_ASSERT_UNEVAL(ML99_IS_LEFT(ML99_LEFT(VAL)));
ML99_ASSERT_UNEVAL(!ML99_IS_LEFT(ML99_RIGHT(VAL)));
}
// ML99_isRight
{
ML99_ASSERT(ML99_isRight(ML99_right(VAL)));
ML99_ASSERT(ML99_not(ML99_isRight(ML99_left(VAL))));
}
// ML99_IS_RIGHT
{
ML99_ASSERT_UNEVAL(ML99_IS_RIGHT(ML99_RIGHT(VAL)));
ML99_ASSERT_UNEVAL(!ML99_IS_RIGHT(ML99_LEFT(VAL)));
}
// ML99_eitherEq
{
ML99_ASSERT(ML99_eitherEq(v(ML99_natEq), ML99_left(v(123)), ML99_left(v(123))));
ML99_ASSERT(ML99_not(ML99_eitherEq(v(ML99_natEq), ML99_left(v(18)), ML99_left(v(123)))));
ML99_ASSERT(ML99_eitherEq(v(ML99_natEq), ML99_right(v(123)), ML99_right(v(123))));
ML99_ASSERT(ML99_not(ML99_eitherEq(v(ML99_natEq), ML99_right(v(18)), ML99_right(v(123)))));
ML99_ASSERT(ML99_not(ML99_eitherEq(v(ML99_natEq), ML99_left(v(123)), ML99_right(v(123)))));
ML99_ASSERT(ML99_not(ML99_eitherEq(v(ML99_natEq), ML99_left(v(123)), ML99_right(v(4)))));
ML99_ASSERT(ML99_not(ML99_eitherEq(v(ML99_natEq), ML99_right(v(123)), ML99_left(v(123)))));
ML99_ASSERT(ML99_not(ML99_eitherEq(v(ML99_natEq), ML99_right(v(123)), ML99_left(v(4)))));
}
// ML99_unwrapLeft
{ ML99_ASSERT_EQ(ML99_unwrapLeft(ML99_left(v(123))), v(123)); }
// ML99_unwrapRight
{ ML99_ASSERT_EQ(ML99_unwrapRight(ML99_right(v(123))), v(123)); }
}
|