From: simonpj@microsoft.com Date: Fri, 2 Oct 2009 11:14:36 +0000 (+0000) Subject: Comments only X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=2ebd4bf2d64831d6363ac935efff3229aebc7530;p=ghc-hetmet.git Comments only --- diff --git a/compiler/deSugar/DsUtils.lhs b/compiler/deSugar/DsUtils.lhs index 9a0e752..6ff3916 100644 --- a/compiler/deSugar/DsUtils.lhs +++ b/compiler/deSugar/DsUtils.lhs @@ -419,7 +419,7 @@ But that is bad for two reasons: Seq is very, very special! So we recognise it right here, and desugar to case x of _ -> case y of _ -> (# x,y #) -Note [Desugaring seq (2)] cf Trac #2231 +Note [Desugaring seq (2)] cf Trac #2273 ~~~~~~~~~~~~~~~~~~~~~~~~~ Consider let chp = case b of { True -> fst x; False -> 0 } @@ -447,10 +447,14 @@ should have said explicitly But that's painful. So the code here does a little hack to make seq more robust: a saturated application of 'seq' is turned *directly* into -the case expression. So we desugar to: +the case expression, thus: + x `seq` e2 ==> case x of x -> e2 -- Note shadowing! + e1 `seq` e2 ==> case x of _ -> e2 + +So we desugar our example to: let chp = case b of { True -> fst x; False -> 0 } case chp of chp { I# -> ...chp... } -Notice the shadowing of the case binder! And now all is well. +And now all is well. The reason it's a hack is because if you define mySeq=seq, the hack won't work on mySeq.