Template Haskell
         konn
Template Haskell
Template Haskell

 Haskell
Template Haskell

 Haskell
Template Haskell

 Haskell




           Q
Template Haskell

 Haskell




           Q

 C preprocessor
TH
TH

Haskell
TH

     Haskell




IO

     compile-time wxWidgets Network...
RandomDef.hs
{-# LANGUAGE TemplateHaskell #-}
module Main where
import Language.Haskell.TH
import System.Random

$( do rnd <- runIO $ randomRIO (0,1)
     let nm = mkName (["a", "b"] !! rnd)
     m <- [d| main = $(varE $ mkName "a") |]
     t <- valD (varP nm) (normalB [| putStrLn " ( ´ `) " |]) []
     return (t:m)
 )
RandomDef.hs
{-# LANGUAGE TemplateHaskell #-}
module Main where
import Language.Haskell.TH
import System.Random IO

$( do rnd <- runIO $ randomRIO (0,1)
     let nm = mkName (["a", "b"] !! rnd)
     m <- [d| main = $(varE $ mkName "a") |]
     t <- valD (varP nm) (normalB [| putStrLn " ( ´ `) " |]) []
     return (t:m)
 )
Splice(                     )
{-# LANGUAGE TemplateHaskell #-}
module Main where
import Language.Haskell.TH
import System.Random

$( do rnd <- runIO $ randomRIO (0,1)
     let nm = mkName (["a", "b"] !! rnd)
     m <- [d| main = $(varE $ mkName "a") |]
     t <- valD (varP nm) (normalB [| putStrLn " ( ´ `) " |]) []
     return (t:m)
 )
Splice
Splice
(Q   )
Splice
  (Q        )

splice

         splice
Splice
      (Q        )

    splice

             splice




“                     ”
{-# LANGUAGE TemplateHaskell #-}
module Main where
import Language.Haskell.TH
import System.Random

$( do rnd <- runIO $ randomRIO (0,1)
     let nm = mkName (["a", "b"] !! rnd)
     m <- [d| main = $(varE $ mkName "a") |]
     t <- valD (varP nm) (normalB [| putStrLn " ( ´ `) " |]) []
     return (t:m)
 )
[   |
[   |
        [| putStrLn “hogehoge” |]
[   |
        [| putStrLn “hogehoge” |]
        [t| String |]
[   |
        [| putStrLn “hogehoge” |]
        [t| String |]
          [d| main = putStrLn |]
[   |
        [| putStrLn “hogehoge” |]
        [t| String |]
          [d| main = putStrLn |]
        [$ident| function f() {..} |]
[   |
              [| putStrLn “hogehoge” |]
              [t| String |]
                [d| main = putStrLn |]
              [$ident| function f() {..} |]
        DSL
[   |
              [| putStrLn “hogehoge” |]
              [t| String |]
                [d| main = putStrLn |]
              [$ident| function f() {..} |]
        DSL
[   |
                [| putStrLn “hogehoge” |]
                [t| String |]
                  [d| main = putStrLn |]
                [$ident| function f() {..} |]
          DSL


        )JavaScript                 (
splice
[d| main = $(varE $ mkName "a") |]

                       splice

                [d| main = ‘a |]         TH
   a

                                `a

            ``String
{-# LANGUAGE TemplateHaskell #-}
module Main where
import Language.Haskell.TH
import System.Random

$( do rnd <- runIO $ randomRIO (0,1)
     let nm = mkName (["a", "b"] !! rnd)
     m <- [d| main = $(varE $ mkName "a") |]
     t <- valD (varP nm) (normalB [| putStrLn " ( ´ `) " |]) []
     return (t:m)
 )
valD (varP nm) (normalB [| putStrLn " ( ´ `) " |]) []

          [d| $(varP nm) = putStrLn “ ( ´ `) ” |]

                        ……                ……

                ghci

   > runQ [d| main = putStrLn “hoge” |]
Sucks



GHC

 TH                Ver.UP
      (ex. HOC )
lib2 =
   let
      l=LetS[ValD(VarP $ mkName"it")(NormalB(f"be"))[]]
      f=VarE . mkName
   in
      DoE [ l, l, l, NoBindS $ f"oh",l,
      NoBindS $ InfixE(Just$ f"speaking")(f"words")(Just $ f "wisdom"),l]
lib2 =
   let
      l=LetS[ValD(VarP $ mkName"it")(NormalB(f"be"))[]]
      f=VarE . mkName
   in
      DoE [ l, l, l, NoBindS $ f"oh",l,
      NoBindS $ InfixE(Just$ f"speaking")(f"words")(Just $ f "wisdom"),l]
lib2 =
   let
      l=LetS[ValD(VarP $ mkName"it")(NormalB(f"be"))[]]
      f=VarE . mkName
   in
      DoE [ l, l, l, NoBindS $ f"oh",l,
      NoBindS $ InfixE(Just$ f"speaking")(f"words")(Just $ f "wisdom"),l]

                            do let it = be
                              let it = be
                              let it = be
                              oh
                              let it = be
                              speaking `words` wisdom
                              let it = be
reify




        IO   reify

  Q

Template Haskell とか

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
    Template Haskell Haskell Q C preprocessor
  • 7.
  • 8.
  • 9.
    TH Haskell IO compile-time wxWidgets Network...
  • 11.
    RandomDef.hs {-# LANGUAGE TemplateHaskell#-} module Main where import Language.Haskell.TH import System.Random $( do rnd <- runIO $ randomRIO (0,1) let nm = mkName (["a", "b"] !! rnd) m <- [d| main = $(varE $ mkName "a") |] t <- valD (varP nm) (normalB [| putStrLn " ( ´ `) " |]) [] return (t:m) )
  • 12.
    RandomDef.hs {-# LANGUAGE TemplateHaskell#-} module Main where import Language.Haskell.TH import System.Random IO $( do rnd <- runIO $ randomRIO (0,1) let nm = mkName (["a", "b"] !! rnd) m <- [d| main = $(varE $ mkName "a") |] t <- valD (varP nm) (normalB [| putStrLn " ( ´ `) " |]) [] return (t:m) )
  • 13.
    Splice( ) {-# LANGUAGE TemplateHaskell #-} module Main where import Language.Haskell.TH import System.Random $( do rnd <- runIO $ randomRIO (0,1) let nm = mkName (["a", "b"] !! rnd) m <- [d| main = $(varE $ mkName "a") |] t <- valD (varP nm) (normalB [| putStrLn " ( ´ `) " |]) [] return (t:m) )
  • 14.
  • 15.
  • 16.
    Splice (Q ) splice splice
  • 17.
    Splice (Q ) splice splice “ ”
  • 18.
    {-# LANGUAGE TemplateHaskell#-} module Main where import Language.Haskell.TH import System.Random $( do rnd <- runIO $ randomRIO (0,1) let nm = mkName (["a", "b"] !! rnd) m <- [d| main = $(varE $ mkName "a") |] t <- valD (varP nm) (normalB [| putStrLn " ( ´ `) " |]) [] return (t:m) )
  • 20.
    [ |
  • 21.
    [ | [| putStrLn “hogehoge” |]
  • 22.
    [ | [| putStrLn “hogehoge” |] [t| String |]
  • 23.
    [ | [| putStrLn “hogehoge” |] [t| String |] [d| main = putStrLn |]
  • 24.
    [ | [| putStrLn “hogehoge” |] [t| String |] [d| main = putStrLn |] [$ident| function f() {..} |]
  • 25.
    [ | [| putStrLn “hogehoge” |] [t| String |] [d| main = putStrLn |] [$ident| function f() {..} |] DSL
  • 26.
    [ | [| putStrLn “hogehoge” |] [t| String |] [d| main = putStrLn |] [$ident| function f() {..} |] DSL
  • 27.
    [ | [| putStrLn “hogehoge” |] [t| String |] [d| main = putStrLn |] [$ident| function f() {..} |] DSL )JavaScript (
  • 28.
    splice [d| main =$(varE $ mkName "a") |] splice [d| main = ‘a |] TH a `a ``String
  • 29.
    {-# LANGUAGE TemplateHaskell#-} module Main where import Language.Haskell.TH import System.Random $( do rnd <- runIO $ randomRIO (0,1) let nm = mkName (["a", "b"] !! rnd) m <- [d| main = $(varE $ mkName "a") |] t <- valD (varP nm) (normalB [| putStrLn " ( ´ `) " |]) [] return (t:m) )
  • 30.
    valD (varP nm)(normalB [| putStrLn " ( ´ `) " |]) [] [d| $(varP nm) = putStrLn “ ( ´ `) ” |] …… …… ghci > runQ [d| main = putStrLn “hoge” |]
  • 31.
    Sucks GHC TH Ver.UP (ex. HOC )
  • 32.
    lib2 = let l=LetS[ValD(VarP $ mkName"it")(NormalB(f"be"))[]] f=VarE . mkName in DoE [ l, l, l, NoBindS $ f"oh",l, NoBindS $ InfixE(Just$ f"speaking")(f"words")(Just $ f "wisdom"),l]
  • 33.
    lib2 = let l=LetS[ValD(VarP $ mkName"it")(NormalB(f"be"))[]] f=VarE . mkName in DoE [ l, l, l, NoBindS $ f"oh",l, NoBindS $ InfixE(Just$ f"speaking")(f"words")(Just $ f "wisdom"),l]
  • 34.
    lib2 = let l=LetS[ValD(VarP $ mkName"it")(NormalB(f"be"))[]] f=VarE . mkName in DoE [ l, l, l, NoBindS $ f"oh",l, NoBindS $ InfixE(Just$ f"speaking")(f"words")(Just $ f "wisdom"),l] do let it = be let it = be let it = be oh let it = be speaking `words` wisdom let it = be
  • 35.
    reify IO reify Q