forwarded message from Henry Cejtin
   
    Stephen Weeks
     
    sweeks@intertrust.com
       
    Tue, 10 Oct 2000 15:37:01 -0700 (PDT)
    
    
  
Received: from maguro.epr.com ([198.3.162.27]) by exchange.epr.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2650.21)
	id TV5JRBK0; Tue, 10 Oct 2000 15:19:16 -0700
Received: from magrathea.epr.com (firewall-user@magrathea.epr.com [198.3.160.1])
	by maguro.epr.com (8.9.3/8.9.3) with ESMTP id PAA03901
	for <sweeks@intertrust.com>; Tue, 10 Oct 2000 15:22:26 -0700 (PDT)
Received: (from uucp@localhost) by magrathea.epr.com (8.9.3/8.7.3) id PAA21047 for <sweeks@intertrust.com>; Tue, 10 Oct 2000 15:22:12 -0700 (PDT)
Received: from nodnsquery(199.249.165.245) by magrathea.epr.com via smap (V5.5)
	id xma021018; Tue, 10 Oct 00 15:22:09 -0700
Received: (from henry@localhost)
	by syzygy.clairv.com (8.9.3/8.9.3) id RAA32337
	for sweeks@intertrust.com; Tue, 10 Oct 2000 17:22:08 -0500
Message-Id: <200010102222.RAA32337@syzygy.clairv.com>
From: Henry Cejtin <henry@sourcelight.com>
To: sweeks@intertrust.com
Subject: Re: MLton's closure conversion
Date: Tue, 10 Oct 2000 17:22:08 -0500
Interesting.  Note, one thing we can do is to delay any selection (or some of
the selections) until you get to a split in the control flow such  that  some
of  the  environment  is  dead  in one of the branches.  Since everything was
flattened out already in the F2 example (non-curried case) this wouldn't help
there,  I  could  imagine big improvements otherwise.  I.e., in one branch of
that all the environment is dead, and in the other all of it is  alive:  thus
you  would  just  delay  all selects (eliminating them from the fast case and
delaying further in the slow case).
The general problem of currying also is interesting.  We tend not to use  it,
so  it  doesn't  show  up  very much in our code.  We could transform curried
functions into curried calls to uncurried ones.  I.e., replace
    fun f a b c =
           if a > 0
              then f (b + c) x (f y z w)
           else 17
to
    fun f' (a, b, c) =
           if a > 0
              then f' (b + c, x, f' (y, z, w))
              else 17
    fun f a b c = f' (a, b, c)
and then use the inliner to convert the f calls to f' in the case that it  is
completely called.