[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Some questions

    From: glacier!franz!fimass!jkf@kim.Berkeley.EDU (John Foderaro)
    To: ucbkim!Xerox.COM!miller.pa
    Cc: common-lisp@su-ai.arpa
    Subject: Re: Some questions 

    >> Do you transform the source to continuation passing style before
    >> compiling?  
    >> How happy are you with this decision?  
    >> If you don't, do you do tail-recursion optimizations anyway?

	The Franz Inc. ExCL (Extended Common Lisp) compiler does not
    transform to a continuation passing style before compilation.  It
    detects tail-recursive calls and eliminates some self-tail-recursive
    calls and will soon give the user the option of eliminating non-self
    tail-recursive calls on certain architectures.

Unless, you're talking about self-recursive LABELS, note that
according to a discussion on this mailing list long ago, it is not
legal to implement
	(defun revappend (a b)
	  (if (null a)
	      (revappend (cdr a) (prog1 a (setf (cdr a) b)))))
with a branch back to the beginning of the code, because function
calls are defined in terms of symbol-function of the symbol that
happens to be the car of a form.  Thus you could do
	(setf (symbol-function 'foo) (symbol-function 'revappend))
and it would still be expected to call whatever is in the
symbol-function cell of revappend for recursive calls.  I'm not sure I
like this (at the timeI was suggesting that DEFUN ought to provide an
implicit LABELS so that the self-recursion did the obvious thing), but
that's what was decided.

Of course, that doesn't mean it isn't possible to do tail-recursion
elimination, as long as what you're doing is jump to the contents of
the appropriate symbol-function cell value, as opposed to a simple
branch.  Since your message said you only currently did
self-tail-recursion I'm assuming that's not what you're doing.