I compiled this program (fact.bitc)
--- snip ---
(bitc-version "0.10")
(import bitc.main as main)
(provide bitc.main main)
(define (factorial x:int32)
(letrec
((fac (lambda (n r)
(if (<= n 0) 1 (fac (- n 1) (* n r))))))
(fac x 1)))
(define main.main:(fn (vector string) -> int32)
(lambda (argv)
(factorial 10)
0))
--- snip ---
with
bitcc --emit c fact.bitc
and expected to see the tail call of 'fac' compiled to a 'goto'.
But I found the following code for the 'if'-expression:
--- snip ---
if (__t11241) {
__t11245 = 1;
}
else {
__t11252 = _16bitc_DTprelude_DT___HY_SHFN2_5int32_5int32_5int32
(_1n_SH_5int32_SH7462, 1);
__t11256 = _16bitc_DTprelude_DT___ST_SHFN2_5int32_5int32_5int32
(_1n_SH_5int32_SH7462, _1r_SH_5int32_SH7464);
__t11260 = (* __clArg_SH9094->_3fac_SHFN2_5int32_5int32_5int32)(__t11252,
__t11256);
__t11245 = __t11260;
}
--- snip ---
and __t11245 really is returned without further operations apart from copying.
So 'fac' is in tail position but is called. And as far as i can see 12.2 of
the spec v0.10+ applies here.
Another bug?
--
MfG Marvin H. Sielenkemper
_______________________________________________
bitc-dev mailing list
[email protected]
http://www.coyotos.org/mailman/listinfo/bitc-dev