On 1/10/07, Zbigniew <address@hidden> wrote:
> Apropos of nothing, if you surround the body of FAC with (let ((fac
> fac)) ...) or even (let loop ((n n)) ...) then you avoid a global
> lookup on FAC on every recursive call. This is the same as compiling
> the file in block mode, except the latter doesn't work for exported
> definitions. This is something most people here probably know, but
> it's an interesting optimization trick that took me a while to come
> across.
Thanks, Zbigniew -- I had never thought to do that. :-)
A macro comes to mind:
(define-macro (define/rec sig . body)
(let ((name (car sig)))
`(define (,name ,@(cdr sig))
(let ((,name ,name))
,@body))))
(macroexpand '(define/rec (fac n) (if (zero? n) 1 (* n (fac (- n 1))))))
=> (##core#set! fac (lambda (n) (let ((fac fac)) (if (zero? n) 1 (* n
(fac (- n 1)))))))