about summary refs log tree commit diff stats
path: root/linux/factorial.mu
diff options
context:
space:
mode:
Diffstat (limited to 'linux/factorial.mu')
-rw-r--r--linux/factorial.mu60
1 files changed, 60 insertions, 0 deletions
diff --git a/linux/factorial.mu b/linux/factorial.mu
new file mode 100644
index 00000000..15ac8cf4
--- /dev/null
+++ b/linux/factorial.mu
@@ -0,0 +1,60 @@
+# compute the factorial of 5, and return the result in the exit code
+#
+# To run:
+#   $ ./translate_mu apps/factorial.mu
+#   $ ./a.elf
+#   $ echo $?
+#   120
+#
+# You can also run the automated test suite:
+#   $ ./a.elf test
+# Expected output:
+#   ........
+# Every '.' indicates a passing test. Failing tests get a 'F'.
+# There's only one test in this file, but you'll also see tests running from
+# Mu's standard library.
+#
+# Compare apps/factorial4.subx
+
+fn factorial n: int -> _/eax: int {
+  compare n, 1
+  # if (n <= 1) return 1
+  {
+    break-if->
+    return 1
+  }
+  # n > 1; return n * factorial(n-1)
+  var tmp/ecx: int <- copy n
+  tmp <- decrement
+  var result/eax: int <- factorial tmp
+  result <- multiply n
+  return result
+}
+
+fn test-factorial {
+  var result/eax: int <- factorial 5
+  check-ints-equal result, 0x78, "F - test-factorial"
+}
+
+fn main args-on-stack: (addr array addr array byte) -> _/ebx: int {
+  var args/eax: (addr array addr array byte) <- copy args-on-stack
+  # len = length(args)
+  var len/ecx: int <- length args
+  # if (len <= 1) return factorial(5)
+  compare len, 1
+  {
+    break-if->
+    var exit-status/eax: int <- factorial 5
+    return exit-status
+  }
+  # if (args[1] == "test") run-tests()
+  var tmp2/ecx: (addr addr array byte) <- index args, 1
+  var tmp3/eax: boolean <- string-equal? *tmp2, "test"
+  compare tmp3, 0
+  {
+    break-if-=
+    run-tests
+    # TODO: get at Num-test-failures somehow
+  }
+  return 0
+}