[r6rs-discuss] [Formal] Remove double phase semantics

From: AndrevanTonder <andre>
Date: Sun Nov 26 17:36:18 2006

On Sun, 26 Nov 2006, dyb_at_cs.indiana.edu wrote:

> Having done the pointing out, I feel I should clarify. The obvious
> problem with Andre's transformation is that it introduces additional local
> variables and indirects, so the claim that the multi-phase model can be
> implemented as efficiently as the single-phase model is wrong. A more
> subtle and potentially more costly problem is that it will cause closures
> to become larger and/or more deeply nested (with more indirects).
> Furthemore, it will also inhibit closure elimination, and optimization
> that Chez Scheme and possibly some other systems do.

After thinking about this some more, I believe the inefficiency can easily be
eliminated for level-0 (runtime) code where it is likely to matter most. The
previous example

     (library bar
       (export g)
       (import (only foo f))
       (define (g) (f)))

can be transformed in the separate-binding model to the pair of procedures

     (define (bar-invoke-at-level>0 level)
       (let ((foo-f ($import-value 'foo-f level)))
         (letrec* ((g (lambda () (foo-f))))
           ($export-value 'bar-g level g)))

     (define bar-g (unspecified)) ; level 0 bar-g is global

     (define (bar-invoke-at-level-0)
       (letrec* ((g (lambda () (foo-f)))) ; level 0 foo-f is global
         (set! bar-g g)))

All the usual optimizations would apply to the second, runtime procedure, which
is the only one that needs to be included in fully-compiled deliverables.

Andre
Received on Sun Nov 26 2006 - 17:32:01 UTC

This archive was generated by hypermail 2.3.0 : Wed Oct 23 2024 - 09:15:00 UTC