Commit | Line | Data |
---|---|---|
7f918cf1 CE |
1 | (*kitloop2.sml*) |
2 | ||
3 | (* A tail-recursive loop which gives stack overflow, unless one | |
4 | uses storage mode analsysis *) | |
5 | ||
6 | val x = | |
7 | let | |
8 | val N = 500 | |
9 | val I = 1000 | |
10 | ||
11 | type int_pair = int * int | |
12 | val maxint = 2000 | |
13 | val zero = (0,0) | |
14 | fun is_zero(0,0) = true | |
15 | | is_zero _ = false | |
16 | ||
17 | fun sub (m,n) = | |
18 | if n=0 then (m-1, maxint) | |
19 | else (m, n-1) | |
20 | ||
21 | fun loop (x as (m,n)) = | |
22 | if is_zero x then x | |
23 | else loop(sub x) | |
24 | ||
25 | fun loop' p = (loop p; "\ndone\n") | |
26 | ||
27 | in | |
28 | print "\nlooping...\n"; | |
29 | print (loop'(maxint,maxint)) | |
30 | end |