Commit 8628e3c4 authored by simonpj's avatar simonpj
Browse files

[project @ 2004-02-03 16:46:33 by simonpj]

Add comments about Template Haskell
parent 29834dd5
...@@ -1598,7 +1598,7 @@ declarations ...@@ -1598,7 +1598,7 @@ declarations
</programlisting> </programlisting>
"overlap" if <literal>type1</literal> and <literal>type2</literal> unify. "overlap" if <literal>type1</literal> and <literal>type2</literal> unify.
</para>
<para> <para>
However, if you give the command line option However, if you give the command line option
<option>-fallow-overlapping-instances</option><indexterm><primary>-fallow-overlapping-instances <option>-fallow-overlapping-instances</option><indexterm><primary>-fallow-overlapping-instances
...@@ -3184,6 +3184,12 @@ the background to ...@@ -3184,6 +3184,12 @@ the background to
the main technical innovations is discussed in "<ulink the main technical innovations is discussed in "<ulink
url="http://research.microsoft.com/~simonpj/papers/meta-haskell"> url="http://research.microsoft.com/~simonpj/papers/meta-haskell">
Template Meta-programming for Haskell</ulink>" (Proc Haskell Workshop 2002). Template Meta-programming for Haskell</ulink>" (Proc Haskell Workshop 2002).
The details of the Template Haskell design are still in flux. Make sure you
consult the <ulink url="http://www.haskell.org/ghc/docs/latest/html/libraries/index.html">online library reference material</ulink>
(search for the type ExpQ).
[Temporary: many changes to the original design are described in
<ulink url="http://research.microsoft.com/~simonpj/tmp/notes2.ps">"http://research.microsoft.com/~simonpj/tmp/notes2.ps"</ulink>.
Not all of these changes are in GHC 6.2.]
</para> </para>
<para> The first example from that paper is set out below as a worked example to help get you started. <para> The first example from that paper is set out below as a worked example to help get you started.
...@@ -3289,6 +3295,7 @@ Tim Sheard is going to expand it.) ...@@ -3289,6 +3295,7 @@ Tim Sheard is going to expand it.)
First cut and paste the two modules below into "Main.hs" and "Printf.hs":</para> First cut and paste the two modules below into "Main.hs" and "Printf.hs":</para>
<programlisting> <programlisting>
{- Main.hs -} {- Main.hs -}
module Main where module Main where
...@@ -3299,9 +3306,8 @@ import Printf ( pr ) ...@@ -3299,9 +3306,8 @@ import Printf ( pr )
-- generated at compile time by "pr" and splices it into -- generated at compile time by "pr" and splices it into
-- the argument of "putStrLn". -- the argument of "putStrLn".
main = putStrLn ( $(pr "Hello") ) main = putStrLn ( $(pr "Hello") )
</programlisting>
<programlisting>
{- Printf.hs -} {- Printf.hs -}
module Printf where module Printf where
...@@ -3324,14 +3330,14 @@ parse s = [ L s ] ...@@ -3324,14 +3330,14 @@ parse s = [ L s ]
-- Generate Haskell source code from a parsed representation -- Generate Haskell source code from a parsed representation
-- of the format string. This code will be spliced into -- of the format string. This code will be spliced into
-- the module which calls "pr", at compile time. -- the module which calls "pr", at compile time.
gen :: [Format] -> Expr gen :: [Format] -> ExpQ
gen [D] = [| \n -> show n |] gen [D] = [| \n -> show n |]
gen [S] = [| \s -> s |] gen [S] = [| \s -> s |]
gen [L s] = string s gen [L s] = stringE s
-- Here we generate the Haskell code for the splice -- Here we generate the Haskell code for the splice
-- from an input format string. -- from an input format string.
pr :: String -> Expr pr :: String -> ExpQ
pr s = gen (parse s) pr s = gen (parse s)
</programlisting> </programlisting>
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment