+ --debug is now --imcc-debug; make this more consistent with -D.
[parrot.git] / examples / shootout / recursive.pir
blob95996839ffd616c267be70d22c92dfc15e26cd8c
1 #!./parrot -Oc -Cj
3 # Ack by Leopold Toetsch
4 # Fib and Tak by Joshua Isom
5 # modified default value to n=3. Karl Forner
7 .sub main :main
8         .param pmc argv
9         .local int argc, n
10         argc = argv
11         n = 3 
12         unless argc == 2 goto argsok
13         $S0 = argv[1]
14         n = $S0
15 argsok:
16     $P0 = getinterp
17     $P0.'recursion_limit'(100000)
19         .local pmc array
20         array = new 'FixedFloatArray'
21         array = 11
23         dec n
25         $I0 = n + 1
26         $I1 = ack(3, $I0)
27         array[0] = $I0
28         array[1] = $I1
30         $N0 = 28.0 + n
31         array[2] = $N0
32         $N0 = FibNum($N0)
33         array[3] = $N0
35         $I0 = n * 3
36         $I1 = n * 2
37         array[4] = $I0
38         array[5] = $I1
39         array[6] = n
40         $I0 = TakInt($I0, $I1, n)
41         array[7] = $I0
43         $I0 = FibInt(3)
44         array[8] = $I0
46         $N0 = TakNum(3.0, 2.0, 1.0)
47         array[9] = $N0
49         $S0 = sprintf <<"END", array
50 Ack(3,%d): %d
51 Fib(%.1f): %.1f
52 Tak(%d,%d,%d): %d
53 Fib(3): %d
54 Tak(3.0,2.0,1.0): %.1f
55 END
56         print $S0
57 .end
59 .sub ack
60         .param int x
61         .param int y
62         if x goto a1
63         $I0 = y + 1
64         .return ($I0)
65 a1:
66         if y goto a2
67         $I0 = x - 1
68         $I1 = 1
69         .return ack($I0, $I1)
70 a2:
71         $I2 = y - 1
72         $I3 = ack(x, $I2)
73         $I4 = x - 1
74         .return ack($I4, $I3)
75 .end
77 .sub FibInt
78         .param int n
79         unless n < 2 goto endif
80         .return(1)
81 endif:
82         .local int tmp
83         tmp = n - 2
84         $I0 = FibInt(tmp)
85         tmp = n - 1
86         $I1 = FibInt(tmp)
87         $I0 += $I1
88         .return($I0)
89 .end
91 .sub FibNum
92         .param num n
93         unless n < 2 goto endif
94         .return(1.0)
95 endif:
96         .local num tmp
97         tmp = n - 2
98         $N0 = FibNum(tmp)
99         tmp = n - 1
100         $N1 = FibNum(tmp)
101         $N0 += $N1
102         .return($N0)
103 .end
105 .sub TakNum
106         .param num x
107         .param num y
108         .param num z
109         unless y >= x goto endif
110         .return(z)
111 endif:
112         .local num tmp
113         tmp = x - 1.0
114         $N0 = TakNum(tmp, y, z)
115         tmp = y - 1.0
116         $N1 = TakNum(tmp, z, x)
117         tmp = z - 1.0
118         $N2 = TakNum(tmp, x, y)
119         .return TakNum($N0, $N1, $N2)
120 .end
122 .sub TakInt
123         .param int x
124         .param int y
125         .param int z
126         unless y >= x goto endif
127         .return(z)
128 endif:
129         .local int tmp
130         tmp = x - 1
131         $I0 = TakInt(tmp, y, z)
132         tmp = y - 1
133         tmp = TakInt(tmp, z, x)
134         dec z
135         z = TakInt(tmp, x, y)
136         .return TakInt($I0, tmp, z)
137 .end
140 # Local Variables:
141 #   mode: pir
142 #   fill-column: 100
143 # End:
144 # vim: expandtab shiftwidth=4: