[Openmcl-devel] consing
Joshua TAYLOR
joshuaaaron at gmail.com
Wed May 15 11:12:38 PDT 2013
On Tue, May 14, 2013 at 10:10 AM, John Miller <millejoh at me.com> wrote:
> Ummm, tail recursion?
>
> (dissasemble 'fac) might make for an interesting read.
CCL doesn't optimize the non-tail recursive
(defun fac (n) (if (= n 0) 1 (* n (fac (- n 1)))))
into a tail-recursive version with an accumulator, though, at the
default optimization levels, anyway. Rather it performs the recursive
call (fac (- n 1)) and then returns to multiply the result by n:
$ ccl64
Welcome to Clozure Common Lisp Version 1.7-r14925M (LinuxX8664)!
? (defun fac (n) (if (= n 0) 1 (* n (fac (- n 1)))))
FAC
? (compile 'fac)
FAC
NIL
NIL
? (disassemble 'fac)
;;; (defun fac (n) (if (= n 0) 1 (* n (fac (- n 1)))))
L0
...<snip>
;;; (fac (- n 1))
L124
[124] (movl ($ 8) (% nargs))
[129] (nop)
[133] (nop)
[136] (callq L7)
[141] (leaq (@ (:^ L0) (% rip)) (% fn))
;;; (* n (fac (- n 1)))
[148] (movq (% save0) (% arg_y))
[151] (nop)
[155] (nop)
[158] (callq (@ .SPBUILTIN-TIMES))
[165] (leaq (@ (:^ L0) (% rip)) (% fn))
...<snip>
--
Joshua Taylor, http://www.cs.rpi.edu/~tayloj/
More information about the Openmcl-devel
mailing list