>>> import System.Command.QQ
>>> putStr =<< unlines . reverse . lines <$> [sh|cowsay "Hello, I am command-qq!"|]
|| ||
||----w |
(__)\ )\/\
\ (oo)\_______
\ ^__^
-------------------------
< Hello, I am command-qq! >
_________________________
% cabal install command-qq
>>> [sh_| echo hello world! |]
hello world!
ghci = quoter $ callCommand "ghc" ["-ignore-dot-ghci", "-e"]
Then you can use ghci
in ghci!
>>> [ghci| putStrLn "hello world!" |] :: IO ()
hello world!
For more examples, see System.Command.QQ.Predef
Let's define Embed
instance for a custom data type:
data Bang = Bang
instance Embed Bang where
embed Bang = "!"
Then you can use variables of Bang
type in quoted strings!
>>> [sh_| echo hello#{Bang} |]
hello!
>>> let bang = Bang in [sh_| echo hello#{bang} |]
hello!
Note, command-qq
does not support full Haskell in embeddings,
only variables/constructors names and literals