aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/external/metalang99/examples/factorial.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/external/metalang99/examples/factorial.c')
-rw-r--r--test/external/metalang99/examples/factorial.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/test/external/metalang99/examples/factorial.c b/test/external/metalang99/examples/factorial.c
new file mode 100644
index 0000000..ed381fa
--- /dev/null
+++ b/test/external/metalang99/examples/factorial.c
@@ -0,0 +1,16 @@
+// `...` is sometimes used to workaround a TCC bug, see
+// <https://github.com/hirrolot/datatype99/issues/10#issuecomment-830813172>.
+
+#include <metalang99.h>
+
+#define factorial(n) ML99_natMatch(n, v(factorial_))
+#define factorial_Z_IMPL(...) v(1) // `...` due to the TCC's bug.
+#define factorial_S_IMPL(n) ML99_mul(ML99_inc(v(n)), factorial(v(n)))
+
+ML99_ASSERT_EQ(factorial(v(0)), v(1));
+ML99_ASSERT_EQ(factorial(v(1)), v(1));
+ML99_ASSERT_EQ(factorial(v(2)), v(2));
+ML99_ASSERT_EQ(factorial(v(3)), v(6));
+ML99_ASSERT_EQ(factorial(v(4)), v(24));
+
+int main(void) {}