Spelling fixes in glasgow_exts.xml
[ghc-hetmet.git] / docs / users_guide / glasgow_exts.xml
index 3b83551..e42bf79 100644 (file)
@@ -92,7 +92,7 @@ documentation</ulink> describes all the libraries that come with GHC.
           Haskell 98 described in <xref
           linkend="ghc-language-features"/>, except where otherwise
           noted. We are trying to move away from this portmanteau flag, 
-         and towards enabling features individaully.</para>
+         and towards enabling features individually.</para>
 
          <para>New reserved words: <literal>forall</literal> (only in
          types), <literal>mdo</literal>.</para>
@@ -290,6 +290,17 @@ documentation</ulink> describes all the libraries that come with GHC.
        </listitem>
       </varlistentry>
 
+      <varlistentry>
+       <term><option>-XQuasiQuotes</option></term>
+       <listitem>
+         <para>Enables quasiquotation (see <xref
+         linkend="th-quasiquotation"/>).</para>
+
+         <para>Syntax stolen:
+         <literal>[:<replaceable>varid</replaceable>|</literal>.</para>
+       </listitem>
+      </varlistentry>
+
     </variablelist>
   </sect1>
 
@@ -322,7 +333,7 @@ the result of such processing is part of the description of the
       url="http://www.haskell.org/ghc/docs/papers/core.ps.gz">External
         Core language</ulink>.
 So that document is a good place to look for a type-set version.
-We would be very happy if someone wanted to volunteer to produce an SGML
+We would be very happy if someone wanted to volunteer to produce an XML
 back end to the program that processes <filename>primops.txt</filename> so that
 we could include the results here in the User Guide.</para>
 
@@ -742,7 +753,7 @@ view :: Type -> TypeView
 </programlisting>
 
 The representation of Typ is held abstract, permitting implementations
-to use a fancy representation (e.g., hash-consing to managage sharing).
+to use a fancy representation (e.g., hash-consing to manage sharing).
 
 Without view patterns, using this signature a little inconvenient: 
 <programlisting>
@@ -1102,7 +1113,7 @@ In this example, the list <literal>output</literal> would take on
 (The function <literal>sortWith</literal> is not a keyword; it is an ordinary
 function that is exported by <literal>GHC.Exts</literal>.)</para>
 
-<para>There are five new forms of compehension qualifier,
+<para>There are five new forms of comprehension qualifier,
 all introduced by the (existing) keyword <literal>then</literal>:
     <itemizedlist>
     <listitem>
@@ -1149,7 +1160,7 @@ then group by e using f
     is a function supplied to f by the compiler which lets it compute e on every
     element of the list being transformed. However, unlike the non-grouping case,
     f additionally partitions the list into a number of sublists: this means that
-    at every point after this statement, binders occuring before it in the comprehension
+    at every point after this statement, binders occurring before it in the comprehension
     refer to <emphasis>lists</emphasis> of possible values, not single values. To help understand
     this, let's look at an example:</para>
     
@@ -1285,7 +1296,7 @@ output = [ x
              </para></listitem>
            </itemizedlist>
 In all cases (apart from arrow notation), the static semantics should be that of the desugared form,
-even if that is a little unexpected. For emample, the 
+even if that is a little unexpected. For example, the 
 static semantics of the literal <literal>368</literal>
 is exactly that of <literal>fromInteger (368::Integer)</literal>; it's fine for
 <literal>fromInteger</literal> to have any of the types:
@@ -1526,11 +1537,12 @@ For example, in a <literal>let</literal>, it applies in the right-hand
 sides of other <literal>let</literal>-bindings and the body of the
 <literal>let</literal>C. Or, in recursive <literal>do</literal>
 expressions (<xref linkend="mdo-notation"/>), the local fixity
-declarations of aA <literal>let</literal> statement scope over other
+declarations of a <literal>let</literal> statement scope over other
 statements in the group, just as the bound name does.
 </para>
 
-Moreover, a local fixity declatation *must* accompany a local binding of
+<para>
+Moreover, a local fixity declaration *must* accompany a local binding of
 that name: it is not possible to revise the fixity of name bound
 elsewhere, as in
 <programlisting>
@@ -1539,6 +1551,7 @@ let infixr 9 $ in ...
 
 Because local fixity declarations are technically Haskell 98, no flag is
 necessary to enable them.
+</para>
 </sect2>
 
 </sect1>
@@ -1818,7 +1831,7 @@ apply <function>fn</function> to <literal>val</literal> to get a boolean.  For e
 </para>
 
 <para>
-What this allows us to do is to package heterogenous values
+What this allows us to do is to package heterogeneous values
 together with a bunch of functions that manipulate them, and then treat
 that collection of packages in a uniform manner.  You can express
 quite a bit of object-oriented-like programming this way.
@@ -2199,9 +2212,9 @@ like this:
    data NumInst a 
       = Num a => MkNumInst (NumInst a)
 </programlisting>
-Notice that, unlike the situation when declaring an existental, there is 
+Notice that, unlike the situation when declaring an existential, there is 
 no <literal>forall</literal>, because the <literal>Num</literal> constrains the
-data type's univerally quantified type variable <literal>a</literal>.  
+data type's universally quantified type variable <literal>a</literal>.  
 A constructor may have both universal and existential type variables: for example,
 the following two declarations are equivalent:
 <programlisting>
@@ -2400,7 +2413,7 @@ may use different notation to that implemented in GHC.
 </para>
 <para>
 The rest of this section outlines the extensions to GHC that support GADTs.   The extension is enabled with 
-<option>-XGADTs</option>.
+<option>-XGADTs</option>.  The <option>-XGADTs</option> flag also sets <option>-XRelaxedPolyRec</option>.
 <itemizedlist>
 <listitem><para>
 A GADT can only be declared using GADT-style syntax (<xref linkend="gadt-style"/>); 
@@ -3637,8 +3650,8 @@ in GHC, you can give the foralls if you want.  See <xref linkend="universal-quan
  <emphasis>Each universally quantified type variable
 <literal>tvi</literal> must be reachable from <literal>type</literal></emphasis>.
 
-A type variable <literal>a</literal> is "reachable" if it it appears
-in the same constraint as either a type variable free in in
+A type variable <literal>a</literal> is "reachable" if it appears
+in the same constraint as either a type variable free in
 <literal>type</literal>, or another reachable type variable.  
 A value with a type that does not obey 
 this reachability restriction cannot be used without introducing
@@ -4241,7 +4254,7 @@ it has rank-2 types on the left of a function arrow.
 GHC has three flags to control higher-rank types:
 <itemizedlist>
 <listitem><para>
- <option>-XPolymorphicComponents</option>: data constructors (only) can have polymorphic argment types.
+ <option>-XPolymorphicComponents</option>: data constructors (only) can have polymorphic argument types.
 </para></listitem>
 <listitem><para>
  <option>-XRank2Types</option>: any function (including data constructors) can have a rank-2 type.
@@ -4544,7 +4557,7 @@ a type for <varname>ys</varname>; a major benefit of scoped type variables is th
 it becomes possible to do so.
 </para>
 <para>Lexically-scoped type variables are enabled by
-<option>-fglasgow-exts</option>.
+<option>-XScopedTypeVariables</option>.  This flag implies <option>-XRelaxedPolyRec</option>.
 </para>
 <para>Note: GHC 6.6 contains substantial changes to the way that scoped type
 variables work, compared to earlier releases.  Read this section
@@ -4581,7 +4594,7 @@ In Haskell, a programmer-written type signature is implicitly quantified over
 its free type variables (<ulink
 url="http://www.haskell.org/onlinereport/decls.html#sect4.1.2">Section
 4.1.2</ulink> 
-of the Haskel Report).
+of the Haskell Report).
 Lexically scoped type variables affect this implicit quantification rules
 as follows: any type variable that is in scope is <emphasis>not</emphasis> universally
 quantified. For example, if type variable <literal>a</literal> is in scope,
@@ -4602,7 +4615,7 @@ then
 <para>A declaration type signature that has <emphasis>explicit</emphasis>
 quantification (using <literal>forall</literal>) brings into scope the
 explicitly-quantified
-type variables, in the definition of the named function(s).  For example:
+type variables, in the definition of the named function.  For example:
 <programlisting>
   f :: forall a. [a] -> [a]
   f (x:xs) = xs ++ [ x :: a ]
@@ -4610,7 +4623,9 @@ type variables, in the definition of the named function(s).  For example:
 The "<literal>forall a</literal>" brings "<literal>a</literal>" into scope in
 the definition of "<literal>f</literal>".
 </para>
-<para>This only happens if the quantification in <literal>f</literal>'s type
+<para>This only happens if:
+<itemizedlist>
+<listitem><para> The quantification in <literal>f</literal>'s type
 signature is explicit.  For example:
 <programlisting>
   g :: [a] -> [a]
@@ -4620,6 +4635,26 @@ This program will be rejected, because "<literal>a</literal>" does not scope
 over the definition of "<literal>f</literal>", so "<literal>x::a</literal>"
 means "<literal>x::forall a. a</literal>" by Haskell's usual implicit
 quantification rules.
+</para></listitem>
+<listitem><para> The signature gives a type for a function binding or a bare variable binding, 
+not a pattern binding.
+For example:
+<programlisting>
+  f1 :: forall a. [a] -> [a]
+  f1 (x:xs) = xs ++ [ x :: a ]   -- OK
+
+  f2 :: forall a. [a] -> [a]
+  f2 = \(x:xs) -> xs ++ [ x :: a ]   -- OK
+
+  f3 :: forall a. [a] -> [a] 
+  Just f3 = Just (\(x:xs) -> xs ++ [ x :: a ])   -- Not OK!
+</programlisting>
+The binding for <literal>f3</literal> is a pattern binding, and so its type signature
+does not bring <literal>a</literal> into scope.   However <literal>f1</literal> is a
+function binding, and <literal>f2</literal> binds a bare variable; in both cases
+the type signature brings <literal>a</literal> into scope.
+</para></listitem>
+</itemizedlist>
 </para>
 </sect3>
 
@@ -4657,8 +4692,8 @@ already in scope (i.e. bound by the enclosing context), matters are simple: the
 signature simply constrains the type of the pattern in the obvious way.
 </para>
 <para>
-Unlike expression and declaration type signatures, pattern type signatures are not implictly generalised.
-The pattern in a <emphasis>patterm binding</emphasis> may only mention type variables
+Unlike expression and declaration type signatures, pattern type signatures are not implicitly generalised.
+The pattern in a <emphasis>pattern binding</emphasis> may only mention type variables
 that are already in scope.  For example:
 <programlisting>
   f :: forall a. [a] -> (Int, [a])
@@ -4963,6 +4998,15 @@ Wiki page</ulink>.
                  </itemizedlist></para></listitem>
 
              <listitem><para>
+                 A quasi-quotation can appear in either a pattern context or an
+                 expression context and is also written in Oxford brackets:
+                 <itemizedlist>
+                   <listitem><para> <literal>[:<replaceable>varid</replaceable>| ... |]</literal>,
+                        where the "..." is an arbitrary string; a full description of the
+                       quasi-quotation facility is given in <xref linkend="th-quasiquotation"/>.</para></listitem>
+                 </itemizedlist></para></listitem>
+
+             <listitem><para>
                  A name can be quoted with either one or two prefix single quotes:
                  <itemizedlist>
                    <listitem><para> <literal>'f</literal> has type <literal>Name</literal>, and names the function <literal>f</literal>.
@@ -4973,14 +5017,14 @@ Wiki page</ulink>.
                  That is, <literal>''</literal><replaceable>thing</replaceable> interprets <replaceable>thing</replaceable> in a type context.
                     </para></listitem> 
                  </itemizedlist>
-                 These <literal>Names</literal> can be used to construct Template Haskell expressions, patterns, delarations etc.  They
+                 These <literal>Names</literal> can be used to construct Template Haskell expressions, patterns, declarations etc.  They
                  may also be given as an argument to the <literal>reify</literal> function.
                 </para>
                </listitem>
 
                  
        </itemizedlist>
-(Compared to the original paper, there are many differnces of detail.
+(Compared to the original paper, there are many differences of detail.
 The syntax for a declaration splice uses "<literal>$</literal>" not "<literal>splice</literal>".
 The type of the enclosed expression must be  <literal>Q [Dec]</literal>, not  <literal>[Q Dec]</literal>.
 Type splices are not implemented, and neither are pattern splices or quotations.
@@ -5136,6 +5180,124 @@ The basic idea is to compile the program twice:</para>
 </orderedlist>
 </sect2>
 
+<sect2 id="th-quasiquotation">  <title> Template Haskell Quasi-quotation </title>
+<para>Quasi-quotation allows patterns and expressions to be written using
+programmer-defined concrete syntax; the motivation behind the extension and
+several examples are documented in
+"<ulink url="http://www.eecs.harvard.edu/~mainland/ghc-quasiquoting/">Why It's
+Nice to be Quoted: Quasiquoting for Haskell</ulink>" (Proc Haskell Workshop
+2007). The example below shows how to write a quasiquoter for a simple
+expression language.</para>
+
+<para>
+In the example, the quasiquoter <literal>expr</literal> is bound to a value of
+type <literal>Language.Haskell.TH.Quote.QuasiQuoter</literal> which contains two
+functions for quoting expressions and patterns, respectively. The first argument
+to each quoter is the (arbitrary) string enclosed in the Oxford brackets. The
+context of the quasi-quotation statement determines which of the two parsers is
+called: if the quasi-quotation occurs in an expression context, the expression
+parser is called, and if it occurs in a pattern context, the pattern parser is
+called.</para>
+
+<para>
+Note that in the example we make use of an antiquoted
+variable <literal>n</literal>, indicated by the syntax <literal>'int:n</literal>
+(this syntax for anti-quotation was defined by the parser's
+author, <emphasis>not</emphasis> by GHC). This binds <literal>n</literal> to the
+integer value argument of the constructor <literal>IntExpr</literal> when
+pattern matching. Please see the referenced paper for further details regarding
+anti-quotation as well as the description of a technique that uses SYB to
+leverage a single parser of type <literal>String -> a</literal> to generate both
+an expression parser that returns a value of type <literal>Q Exp</literal> and a
+pattern parser that returns a value of type <literal>Q Pat</literal>.
+</para>
+
+<para>In general, a quasi-quote has the form
+<literal>[$<replaceable>quoter</replaceable>| <replaceable>string</replaceable> |]</literal>.
+The <replaceable>quoter</replaceable> must be the name of an imported quoter; it
+cannot be an arbitrary expression.  The quoted <replaceable>string</replaceable> 
+can be arbitrary, and may contain newlines.
+</para>
+<para>
+Quasiquoters must obey the same stage restrictions as Template Haskell, e.g., in
+the example, <literal>expr</literal> cannot be defined
+in <literal>Main.hs</literal> where it is used, but must be imported.
+</para>
+
+<programlisting>
+
+{- Main.hs -}
+module Main where
+
+import Expr
+
+main :: IO ()
+main = do { print $ eval [$expr|1 + 2|]
+          ; case IntExpr 1 of
+              { [$expr|'int:n|] -> print n
+              ;  _              -> return ()
+              }
+          }
+
+
+{- Expr.hs -}
+module Expr where
+
+import qualified Language.Haskell.TH as TH
+import Language.Haskell.TH.Quasi
+
+data Expr  =  IntExpr Integer
+           |  AntiIntExpr String
+           |  BinopExpr BinOp Expr Expr
+           |  AntiExpr String
+    deriving(Show, Typeable, Data)
+
+data BinOp  =  AddOp
+            |  SubOp
+            |  MulOp
+            |  DivOp
+    deriving(Show, Typeable, Data)
+
+eval :: Expr -> Integer
+eval (IntExpr n)        = n
+eval (BinopExpr op x y) = (opToFun op) (eval x) (eval y)
+  where
+    opToFun AddOp = (+)
+    opToFun SubOp = (-)
+    opToFun MulOp = (*)
+    opToFun DivOp = div
+
+expr = QuasiQuoter parseExprExp parseExprPat
+
+-- Parse an Expr, returning its representation as
+-- either a Q Exp or a Q Pat. See the referenced paper
+-- for how to use SYB to do this by writing a single
+-- parser of type String -> Expr instead of two
+-- separate parsers.
+
+parseExprExp :: String -> Q Exp
+parseExprExp ...
+
+parseExprPat :: String -> Q Pat
+parseExprPat ...
+</programlisting>
+
+<para>Now run the compiler:
+</para>
+<programlisting>
+$ ghc --make -XQuasiQuotes Main.hs -o main
+</programlisting>
+
+<para>Run "main" and here is your output:</para>
+
+<programlisting>
+$ ./main
+3
+1
+</programlisting>
+
+</sect2>
+
 </sect1>
 
 <!-- ===================== Arrow notation ===================  -->
@@ -6060,7 +6222,7 @@ key_function :: Int -> String -> (Bool, Double)
        function "<literal>f</literal>" has a number of other effects:
 <itemizedlist>
 <listitem><para>
-No funtions are inlined into <literal>f</literal>.  Otherwise
+No functions are inlined into <literal>f</literal>.  Otherwise
 GHC might inline a big function into <literal>f</literal>'s right hand side, 
 making <literal>f</literal> big; and then inline <literal>f</literal> blindly.
 </para></listitem>
@@ -6149,7 +6311,7 @@ exactly what you asked for, no more and no less.
              there was no pragma).
             </para></listitem>
            <listitem>
-           <para>"<literal>INLINE[~k] f</literal>" means: be willing to inline
+           <para>"<literal>NOINLINE[~k] f</literal>" means: be willing to inline
            <literal>f</literal>
              until phase <literal>k</literal>, but from phase
              <literal>k</literal> onwards do not inline it.
@@ -6425,7 +6587,7 @@ data S = S {-# UNPACK #-} !Int {-# UNPACK #-} !Int
 The programmer can specify rewrite rules as part of the source program
 (in a pragma).  GHC applies these rewrite rules wherever it can, provided (a) 
 the <option>-O</option> flag (<xref linkend="options-optimise"/>) is on, 
-and (b) the <option>-frules-off</option> flag
+and (b) the <option>-fno-rewrite-rules</option> flag
 (<xref linkend="options-f"/>) is not specified, and (c) the
 <option>-fglasgow-exts</option> (<xref linkend="options-language"/>)
 flag is active.
@@ -7034,7 +7196,7 @@ g x = show x
 </para>
 
 <para>
-  However, when external for is generated (via
+  However, when external core is generated (via
   <option>-fext-core</option>), there will be Notes attached to the
   expressions <function>show</function> and <varname>x</varname>.
   The core function declaration for <function>f</function> is:
@@ -7385,6 +7547,7 @@ standard behaviour.
      ;;; Local Variables: ***
      ;;; mode: xml ***
      ;;; sgml-parent-document: ("users_guide.xml" "book" "chapter" "sect1") ***
+     ;;; ispell-local-dictionary: "british" ***
      ;;; End: ***
  -->