Repository : ssh://darcs.haskell.org//srv/darcs/packages/ghc-prim

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/04e62ee51eeeb6214fa3f2e7f354028ebafa6136

>---------------------------------------------------------------

commit 04e62ee51eeeb6214fa3f2e7f354028ebafa6136
Author: Ian Lynagh <[email protected]>
Date:   Tue Nov 13 20:48:00 2012 +0000

    Move lazy from GHC.Base to GHC.Magic

>---------------------------------------------------------------

 GHC/Magic.hs |   28 +++++++++++++++++++++++++++-
 1 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/GHC/Magic.hs b/GHC/Magic.hs
index 969067f..f616343 100644
--- a/GHC/Magic.hs
+++ b/GHC/Magic.hs
@@ -17,7 +17,7 @@
 --
 -----------------------------------------------------------------------------
 
-module GHC.Magic ( inline ) where
+module GHC.Magic ( inline, lazy ) where
 
 -- | The call '(inline f)' arranges that 'f' is inlined, regardless of
 -- its size. More precisely, the call '(inline f)' rewrites to the
@@ -38,3 +38,29 @@ module GHC.Magic ( inline ) where
 inline :: a -> a
 inline x = x
 
+-- | The 'lazy' function restrains strictness analysis a little. The
+-- call '(lazy e)' means the same as 'e', but 'lazy' has a magical
+-- property so far as strictness analysis is concerned: it is lazy in
+-- its first argument, even though its semantics is strict. After
+-- strictness analysis has run, calls to 'lazy' are inlined to be the
+-- identity function.
+--
+-- This behaviour is occasionally useful when controlling evaluation
+-- order. Notably, 'lazy' is used in the library definition of
+-- 'Control.Parallel.par':
+--
+-- > par :: a -> b -> b
+-- > par x y = case (par# x) of _ -> lazy y
+--
+-- If 'lazy' were not lazy, 'par' would look strict in 'y' which
+-- would defeat the whole purpose of 'par'.
+--
+-- Like 'seq', the argument of 'lazy' can have an unboxed type.
+lazy :: a -> a
+lazy x = x
+-- Implementation note: its strictness and unfolding are over-ridden
+-- by the definition in MkId.lhs; in both cases to nothing at all.
+-- That way, 'lazy' does not get inlined, and the strictness analyser
+-- sees it as lazy.  Then the worker/wrapper phase inlines it.
+-- Result: happiness
+



_______________________________________________
Cvs-libraries mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-libraries

Reply via email to