From: mthomas Date: Thu, 28 Nov 2002 01:00:44 +0000 (+0000) Subject: [project @ 2002-11-28 01:00:44 by mthomas] X-Git-Tag: Approx_11550_changesets_converted~1399 X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=2c5ca121806c7ee3d81b728397e6e74ff2909d9d [project @ 2002-11-28 01:00:44 by mthomas] Add a getting started example. Someone with Docbook please check the SGML. --- diff --git a/ghc/docs/users_guide/glasgow_exts.sgml b/ghc/docs/users_guide/glasgow_exts.sgml index 7dff721..4d1ee17 100644 --- a/ghc/docs/users_guide/glasgow_exts.sgml +++ b/ghc/docs/users_guide/glasgow_exts.sgml @@ -3218,6 +3218,9 @@ Template Meta-programming for Haskell", in Proc Haskell Workshop 2002. + The first example from that paper is set out below as a worked example to help get you started. + + The documentation here describes the realisation in GHC. (It's rather sketchy just now; Tim Sheard is going to expand it.) @@ -3301,6 +3304,73 @@ Tim Sheard is going to expand it.) + A Template Haskell Worked Example +To help you get over the confidence barrier, try out this skeletal worked example. + First cut and paste the two modules below into "Main.hs" and "Printf.hs": + + +{- Main.hs -} +module Main where + +-- Import our template "pr" +import Printf ( pr ) + +-- The splice operator $ takes the Haskell source code +-- generated at compile time by "pr" and splices it into +-- the argument of "putStrLn". +main = putStrLn ( $(pr "Hello") ) + + + +{- Printf.hs -} +module Printf where + +-- Skeletal printf from the paper. +-- It needs to be in a separate module to the one where +-- you intend to use it. + +-- Import some Template Haskell syntax +import Language.Haskell.THSyntax + +-- Describe a format string +data Format = D | S | L String + +-- Parse a format string. This is left largely to you +-- as we are here interested in building our first ever +-- Template Haskell program and not in building printf. +parse :: String -> [Format] +parse s = [ L s ] + +-- Generate Haskell source code from a parsed representation +-- of the format string. This code will be spliced into +-- the module which calls "pr", at compile time. +gen :: [Format] -> Expr +gen [D] = [| \n -> show n |] +gen [S] = [| \s -> s |] +gen [L s] = string s + +-- Here we generate the Haskell code for the splice +-- from an input format string. +pr :: String -> Expr +pr s = gen (parse s) + + +Now run the compiler (here we are using a "stage three" build of GHC, at a Cygwin prompt on Windows): + + +stage3/ghc/compiler/ghc-inplace --make -fglasgow-exts -package haskell-src main.hs -o main.exe + + +Run "main.exe" and here is your output: + + + +$ ./main +Hello + + + +