https://github.com/akkartik/mu/blob/main/linux/apps/factorial.mu
 1 # compute the factorial of 5, and return the result in the exit code
 2 #
 3 # To run:
 4 #   $ ./translate apps/factorial.mu
 5 #   $ ./a.elf
 6 #   $ echo $?
 7 #   120
 8 #
 9 # You can also run the automated test suite:
10 #   $ ./a.elf test
11 # Expected output:
12 #   ........
13 # Every '.' indicates a passing test. Failing tests get a 'F'.
14 # There's only one test in this file, but you'll also see tests running from
15 # Mu's standard library.
16 #
17 # Compare factorial4.subx
18 
19 fn factorial n: int -> _/eax: int {
20   compare n, 1
21   # if (n <= 1) return 1
22   {
23     break-if->
24     return 1
25   }
26   # n > 1; return n * factorial(n-1)
27   var tmp/ecx: int <- copy n
28   tmp <- decrement
29   var result/eax: int <- factorial tmp
30   result <- multiply n
31   return result
32 }
33 
34 fn test-factorial {
35   var result/eax: int <- factorial 5
36   check-ints-equal result, 0x78, "F - test-factorial"
37 }
38 
39 fn main args-on-stack: (addr array addr array byte) -> _/ebx: int {
40   var args/eax: (addr array addr array byte) <- copy args-on-stack
41   # len = length(args)
42   var len/ecx: int <- length args
43   # if (len <= 1) return factorial(5)
44   compare len, 1
45   {
46     break-if->
47     var exit-status/eax: int <- factorial 5
48     return exit-status
49   }
50   # if (args[1] == "test") run-tests()
51   var tmp2/ecx: (addr addr array byte) <- index args, 1
52   var tmp3/eax: boolean <- string-equal? *tmp2, "test"
53   compare tmp3, 0
54   {
55     break-if-=
56     run-tests
57     # TODO: get at Num-test-failures somehow
58   }
59   return 0
60 }