On 1/10/07, Zbigniew <[EMAIL PROTECTED]> 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)))))))

--g


_______________________________________________
Chicken-users mailing list
Chicken-users@nongnu.org
http://lists.nongnu.org/mailman/listinfo/chicken-users

Reply via email to