Som v1.5 readme
1 This version includes macro.
2 Eliminate "callt" but generating a proper tail-call.
(see example in hanoi.lst , there is not "callt")
tail-call
A recursive tail-call will be converted into passing parameters and
then instead of a recursive call, use "jump" to the beginning of
function reusing the old activation record. The following example shows
how a tail-call is converted.
[from hanoi.txt]
to
mov n from t2 | other =
if n == 1
num[from] =
num[from] - 1
num[t2] =
num[t2] + 1
print from
printc 58 print t2 nl
else
other = 6 -
from - t2
mov n-1 from
other
mov 1 from t2
mov n-1 other
t2
in S-code:
...
68 Lit
1 // 1
69 Get
3 // from
70 Get
2 // t2
71 Call
mov
72 Get
4 // n - 1
73 Lit 1
74 Sub
75 Get
1 // other
76 Get
2 // t2
77 Callt
mov
78 Ret 5
The last "mov" (77 Callt mov) is converted to:
3 Fun mov
4 Get 4
. . .
45 Lit 1
46 Get 3
47 Get 2
48 Call mov
49 Get 4
50 Lit 1
51 Sub // n - 1
52 Get 1 // other
53 Get 2 // t2
54 Put 2 // -> t2
55 Put 3 // -> other
56 Put 4 // -> n
57 Jmp 4 // goto begin
58 Ret 5
26 June 2005
last update 21 Feb 2024