X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=docs%2Fusers_guide%2Fglasgow_exts.xml;h=b7e8ca4c37db9d4979d0811465b562fa8df9feb6;hb=43e0bca04009902c16f8f764dcb9a78c8da277c9;hp=fb9824c85191c9883944f236adca74ba8234f444;hpb=26c5507eccc275dde3633adb858d0b610cc127ab;p=ghc-hetmet.git
diff --git a/docs/users_guide/glasgow_exts.xml b/docs/users_guide/glasgow_exts.xml
index fb9824c..b7e8ca4 100644
--- a/docs/users_guide/glasgow_exts.xml
+++ b/docs/users_guide/glasgow_exts.xml
@@ -391,7 +391,7 @@ Indeed, the bindings can even be recursive.
the syntax by eliminating odd cases
like Prelude... For example,
when NewQualifiedOperators is on, it is possible to
- write the enerated sequence [Monday..]
+ write the enumerated sequence [Monday..]
without spaces, whereas in Haskell 98 this would be a
reference to the operator ‘.‘
from module Monday.
@@ -6613,13 +6613,24 @@ Because the preprocessor targets Haskell (rather than Core),
Bang patternsGHC supports an extension of pattern matching called bang
-patterns. Bang patterns are under consideration for Haskell Prime.
+patterns, written !pat.
+Bang patterns are under consideration for Haskell Prime.
The Haskell
prime feature description contains more discussion and examples
than the material below.
+The key change is the addition of a new rule to the
+semantics of pattern matching in the Haskell 98 report.
+Add new bullet 10, saying: Matching the pattern !pat
+against a value v behaves as follows:
+
+if v is bottom, the match diverges
+otherwise, pat is matched against v
+
+
+
Bang patterns are enabled by the flag .
@@ -6650,9 +6661,40 @@ A bang only really has an effect if it precedes a variable or wild-card pattern:
f3 !(x,y) = [x,y]
f4 (x,y) = [x,y]
-Here, f3 and f4 are identical; putting a bang before a pattern that
+Here, f3 and f4 are identical;
+putting a bang before a pattern that
forces evaluation anyway does nothing.
-
+
+
+There is one (apparent) exception to this general rule that a bang only
+makes a difference when it precedes a variable or wild-card: a bang at the
+top level of a let or where
+binding makes the binding strict, regardless of the pattern. For example:
+
+let ![x,y] = e in b
+
+is a strict binding: operationally, it evaluates e, matches
+it against the pattern [x,y], and then evaluates b.
+(We say "apparent" exception because the Right Way to think of it is that the bang
+at the top of a binding is not part of the pattern; rather it
+is part of the syntax of the binding.)
+Nested bangs in a pattern binding behave uniformly with all other forms of
+pattern matching. For example
+
+let (!x,[y]) = e in b
+
+is equivalent to this:
+
+let { t = case e of (x,[y]) -> x `seq` (x,y)
+ x = fst t
+ y = snd t }
+in b
+
+The binding is lazy, but when either x or y is
+evaluated by b the entire pattern is matched, including forcing the
+evaluation of x.
+
+
Bang patterns work in case expressions too, of course:
g5 x = let y = f x in body
@@ -6662,18 +6704,6 @@ g7 x = case f x of { !y -> body }
The functions g5 and g6 mean exactly the same thing.
But g7 evaluates (f x), binds y to the
result, and then evaluates body.
-
-Bang patterns work in let and where
-definitions too. For example:
-
-let ![x,y] = e in b
-
-is a strict pattern: operationally, it evaluates e, matches
-it against the pattern [x,y], and then evaluates b
-The "!" should not be regarded as part of the pattern; after all,
-in a function argument ![x,y] means the
-same as [x,y]. Rather, the "!"
-is part of the syntax of let bindings.
@@ -6859,7 +6889,7 @@ Assertion failures can be caught, see the documentation for the
word. The various values for
word that GHC understands are described
in the following sections; any pragma encountered with an
- unrecognised word is (silently)
+ unrecognised word is
ignored. The layout rule applies in pragmas, so the closing #-}
should start in a column to the right of the opening {-#.
@@ -8172,7 +8202,7 @@ r) ->
Special built-in functionsGHC has a few built-in functions with special behaviour. These
are now described in the module GHC.Prim
+url="../libraries/ghc-prim/GHC-Prim.html">GHC.Prim
in the library documentation.