aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/external/metalang99/examples/ackermann.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/external/metalang99/examples/ackermann.c')
-rw-r--r--test/external/metalang99/examples/ackermann.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/test/external/metalang99/examples/ackermann.c b/test/external/metalang99/examples/ackermann.c
new file mode 100644
index 0000000..a3ea623
--- /dev/null
+++ b/test/external/metalang99/examples/ackermann.c
@@ -0,0 +1,22 @@
+#include <metalang99.h>
+
+#define ack(m, n) ML99_natMatchWithArgs(m, v(ack_), n)
+
+#define ack_Z_IMPL(n) ML99_inc(v(n))
+#define ack_S_IMPL(m, n) ML99_natMatchWithArgs(v(n), v(ack_S_), v(m))
+#define ack_S_Z_IMPL(m) ack(v(m), v(1))
+#define ack_S_S_IMPL(n, m) ack(v(m), ack(ML99_inc(v(m)), v(n)))
+
+ML99_ASSERT_EQ(ack(v(0), v(0)), v(1));
+ML99_ASSERT_EQ(ack(v(0), v(1)), v(2));
+ML99_ASSERT_EQ(ack(v(0), v(2)), v(3));
+
+ML99_ASSERT_EQ(ack(v(1), v(0)), v(2));
+ML99_ASSERT_EQ(ack(v(1), v(1)), v(3));
+ML99_ASSERT_EQ(ack(v(1), v(2)), v(4));
+
+ML99_ASSERT_EQ(ack(v(2), v(0)), v(3));
+ML99_ASSERT_EQ(ack(v(2), v(1)), v(5));
+ML99_ASSERT_EQ(ack(v(2), v(2)), v(7));
+
+int main(void) {}