Merge pull request #91 from Gabriel439/usestack
Update tutorial to use `stack`
This commit is contained in:
commit
aa821df59f
1 changed files with 66 additions and 47 deletions
|
@ -24,13 +24,15 @@
|
||||||
If you are already proficient with Haskell, then you can get quickly up to
|
If you are already proficient with Haskell, then you can get quickly up to
|
||||||
speed by reading the Quick Start guide at the top of "Turtle.Prelude".
|
speed by reading the Quick Start guide at the top of "Turtle.Prelude".
|
||||||
|
|
||||||
To follow along with the examples, install the Haskell Platform:
|
The easiest way to follow along with the examples is to download the
|
||||||
|
`stack` package management tool by following the instructions here:
|
||||||
|
|
||||||
<http://www.haskell.org/platform/>
|
<https://github.com/commercialhaskell/stack>
|
||||||
|
|
||||||
... and then install the @turtle@ library by running:
|
... and then run:
|
||||||
|
|
||||||
|
> $ stack install turtle
|
||||||
|
|
||||||
> $ cabal install turtle
|
|
||||||
-}
|
-}
|
||||||
|
|
||||||
module Turtle.Tutorial (
|
module Turtle.Tutorial (
|
||||||
|
@ -97,7 +99,9 @@ import Turtle
|
||||||
-- in both languages:
|
-- in both languages:
|
||||||
--
|
--
|
||||||
-- @
|
-- @
|
||||||
-- #!\/usr\/bin\/env runhaskell
|
-- #!\/usr\/bin\/env stack
|
||||||
|
-- \-\- stack \-\-resolver lts-2.9 \-\-install-ghc runghc \-\-package turtle
|
||||||
|
-- \
|
||||||
-- -- #!\/bin\/bash
|
-- -- #!\/bin\/bash
|
||||||
-- {-\# LANGUAGE OverloadedStrings \#-} --
|
-- {-\# LANGUAGE OverloadedStrings \#-} --
|
||||||
-- --
|
-- --
|
||||||
|
@ -118,20 +122,20 @@ import Turtle
|
||||||
-- > $ ./example.hs
|
-- > $ ./example.hs
|
||||||
-- > Hello, world!
|
-- > Hello, world!
|
||||||
--
|
--
|
||||||
-- If you delete the first line of the program, you can also compile the above
|
-- If you delete the first two lines of the program, you can also compile the
|
||||||
-- code to generate a native executable which will have a much faster startup
|
-- above code to generate a native executable which will have a much faster
|
||||||
-- time and improved performance:
|
-- startup time and improved performance:
|
||||||
--
|
--
|
||||||
-- > $ # `-O2` turns on all optimizations
|
-- > $ # `-O2` turns on all optimizations
|
||||||
-- > $ # `-threaded` helps with piping shell output in and out of Haskell
|
-- > $ # `-threaded` helps with piping shell output in and out of Haskell
|
||||||
-- > $ ghc -O2 -threaded example.hs
|
-- > $ stack ghc -- -O2 -threaded example.hs
|
||||||
-- > $ ./example
|
-- > $ ./example
|
||||||
-- > Hello, world!
|
-- > Hello, world!
|
||||||
--
|
--
|
||||||
-- You can even run Haskell code interactively using @ghci@, which is an
|
-- You can even run Haskell code interactively using @ghci@, which is an
|
||||||
-- interactive REPL for Haskell. You can either use @ghci@ by itself:
|
-- interactive REPL for Haskell. You can either use @ghci@ by itself:
|
||||||
--
|
--
|
||||||
-- > $ ghci
|
-- > $ stack ghci
|
||||||
-- > <ghci links in some libraries>
|
-- > <ghci links in some libraries>
|
||||||
-- > Prelude> :set -XOverloadedStrings
|
-- > Prelude> :set -XOverloadedStrings
|
||||||
-- > Prelude> import Turtle
|
-- > Prelude> import Turtle
|
||||||
|
@ -141,21 +145,9 @@ import Turtle
|
||||||
-- > Prelude Turtle> :quit
|
-- > Prelude Turtle> :quit
|
||||||
-- > $
|
-- > $
|
||||||
--
|
--
|
||||||
-- ... or you can load Haskell code into @ghci@, which will bring all top-level
|
|
||||||
-- values from that program into scope:
|
|
||||||
--
|
|
||||||
-- > $ ghci example.hs
|
|
||||||
-- > <ghci links in some libraries>
|
|
||||||
-- > [1 of 1] Compiling Main ( example.hs, interpreted )
|
|
||||||
-- > Ok, modules loaded: Main.
|
|
||||||
-- > *Main> main
|
|
||||||
-- > <ghci links in some libraries>
|
|
||||||
-- > Hello, world!
|
|
||||||
-- > *Main> :quit
|
|
||||||
-- > $
|
|
||||||
--
|
|
||||||
-- From now on I'll omit @ghci@'s linker output in tutorial examples. You can
|
-- From now on I'll omit @ghci@'s linker output in tutorial examples. You can
|
||||||
-- also silence this linker output by passing the @-v0@ flag to @ghci@.
|
-- also silence this linker output by passing @--ghc-options -v0@ to
|
||||||
|
-- @stack ghci@.
|
||||||
|
|
||||||
-- $compare
|
-- $compare
|
||||||
-- You'll already notice a few differences between the Haskell code and Bash
|
-- You'll already notice a few differences between the Haskell code and Bash
|
||||||
|
@ -172,7 +164,9 @@ import Turtle
|
||||||
-- distinguish strings by quoting them. The following example highlights the
|
-- distinguish strings by quoting them. The following example highlights the
|
||||||
-- difference:
|
-- difference:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
|
-- >
|
||||||
-- > -- #!/bin/bash
|
-- > -- #!/bin/bash
|
||||||
-- > {-# LANGUAGE OverloadedStrings #-} --
|
-- > {-# LANGUAGE OverloadedStrings #-} --
|
||||||
-- > --
|
-- > --
|
||||||
|
@ -187,7 +181,8 @@ import Turtle
|
||||||
-- define things out of order. For example, we could have written our original
|
-- define things out of order. For example, we could have written our original
|
||||||
-- program this way instead:
|
-- program this way instead:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
-- >
|
-- >
|
||||||
-- > {-# LANGUAGE OverloadedStrings #-}
|
-- > {-# LANGUAGE OverloadedStrings #-}
|
||||||
-- >
|
-- >
|
||||||
|
@ -202,7 +197,8 @@ import Turtle
|
||||||
-- (using the @=@ sign). However, the top level of a Haskell program only
|
-- (using the @=@ sign). However, the top level of a Haskell program only
|
||||||
-- permits definitions. If you were to insert a statement at the top-level:
|
-- permits definitions. If you were to insert a statement at the top-level:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
-- >
|
-- >
|
||||||
-- > {-# LANGUAGE OverloadedStrings #-}
|
-- > {-# LANGUAGE OverloadedStrings #-}
|
||||||
-- >
|
-- >
|
||||||
|
@ -218,7 +214,9 @@ import Turtle
|
||||||
-- You can use @do@ notation to create a subroutine that runs more than one
|
-- You can use @do@ notation to create a subroutine that runs more than one
|
||||||
-- command:
|
-- command:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
|
-- >
|
||||||
-- > -- #!/bin/bash
|
-- > -- #!/bin/bash
|
||||||
-- > {-# LANGUAGE OverloadedStrings #-} --
|
-- > {-# LANGUAGE OverloadedStrings #-} --
|
||||||
-- > --
|
-- > --
|
||||||
|
@ -242,7 +240,9 @@ import Turtle
|
||||||
-- results:
|
-- results:
|
||||||
--
|
--
|
||||||
-- @
|
-- @
|
||||||
-- #!\/usr\/bin\/env runhaskell
|
-- #!\/usr\/bin\/env stack
|
||||||
|
-- \-\- stack \-\-resolver lts-2.9 \-\-install-ghc runghc \-\-package turtle
|
||||||
|
-- \
|
||||||
-- -- #!\/bin\/bash
|
-- -- #!\/bin\/bash
|
||||||
-- import Turtle --
|
-- import Turtle --
|
||||||
-- --
|
-- --
|
||||||
|
@ -268,7 +268,9 @@ import Turtle
|
||||||
-- into their own smaller subroutine and then invoke that smaller subroutine
|
-- into their own smaller subroutine and then invoke that smaller subroutine
|
||||||
-- within a larger subroutine:
|
-- within a larger subroutine:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
|
-- >
|
||||||
-- > -- #!/bin/bash
|
-- > -- #!/bin/bash
|
||||||
-- > import Turtle --
|
-- > import Turtle --
|
||||||
-- > --
|
-- > --
|
||||||
|
@ -328,7 +330,8 @@ import Turtle
|
||||||
-- Notice how the above Haskell example used `print` instead of `echo`. Run the
|
-- Notice how the above Haskell example used `print` instead of `echo`. Run the
|
||||||
-- following script to find out what happens if we choose `echo` instead:
|
-- following script to find out what happens if we choose `echo` instead:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
-- >
|
-- >
|
||||||
-- > import Turtle
|
-- > import Turtle
|
||||||
-- >
|
-- >
|
||||||
|
@ -369,7 +372,7 @@ import Turtle
|
||||||
-- Let's open up the REPL and import this library so that we can study the types
|
-- Let's open up the REPL and import this library so that we can study the types
|
||||||
-- and deduce why our program failed:
|
-- and deduce why our program failed:
|
||||||
--
|
--
|
||||||
-- > $ ghci
|
-- > $ stack ghci
|
||||||
-- > Prelude> import Turtle
|
-- > Prelude> import Turtle
|
||||||
-- > Prelude Turtle>
|
-- > Prelude Turtle>
|
||||||
--
|
--
|
||||||
|
@ -459,7 +462,7 @@ import Turtle
|
||||||
-- @turtle@:
|
-- @turtle@:
|
||||||
--
|
--
|
||||||
-- @
|
-- @
|
||||||
-- $ ghci
|
-- $ stack ghci
|
||||||
-- Prelude> :set -XOverloadedStrings
|
-- Prelude> :set -XOverloadedStrings
|
||||||
-- Prelude> import Turtle
|
-- Prelude> import Turtle
|
||||||
-- Prelude Turtle> `cd` \"/tmp\"
|
-- Prelude Turtle> `cd` \"/tmp\"
|
||||||
|
@ -524,7 +527,8 @@ import Turtle
|
||||||
--
|
--
|
||||||
-- Let's illustrate this by adding types to our original script:
|
-- Let's illustrate this by adding types to our original script:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
-- >
|
-- >
|
||||||
-- > import Turtle
|
-- > import Turtle
|
||||||
-- >
|
-- >
|
||||||
|
@ -561,7 +565,8 @@ import Turtle
|
||||||
-- Not every top-level value has to be a subroutine, though. For example, you
|
-- Not every top-level value has to be a subroutine, though. For example, you
|
||||||
-- can define unadorned `Text` values at the top-level, as we saw previously:
|
-- can define unadorned `Text` values at the top-level, as we saw previously:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
-- >
|
-- >
|
||||||
-- > {-# LANGUAGE OverloadedStrings #-}
|
-- > {-# LANGUAGE OverloadedStrings #-}
|
||||||
-- >
|
-- >
|
||||||
|
@ -580,7 +585,8 @@ import Turtle
|
||||||
--
|
--
|
||||||
-- Let's test this out by providing an incorrect type for @\'str\'@:
|
-- Let's test this out by providing an incorrect type for @\'str\'@:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
-- >
|
-- >
|
||||||
-- > {-# LANGUAGE OverloadedStrings #-}
|
-- > {-# LANGUAGE OverloadedStrings #-}
|
||||||
-- >
|
-- >
|
||||||
|
@ -631,7 +637,8 @@ import Turtle
|
||||||
-- Let's also try reversing the type error, providing a number where we expect
|
-- Let's also try reversing the type error, providing a number where we expect
|
||||||
-- a string:
|
-- a string:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
-- >
|
-- >
|
||||||
-- > {-# LANGUAGE OverloadedStrings #-}
|
-- > {-# LANGUAGE OverloadedStrings #-}
|
||||||
-- >
|
-- >
|
||||||
|
@ -666,7 +673,9 @@ import Turtle
|
||||||
-- uses a `shell` command to archive the directory:
|
-- uses a `shell` command to archive the directory:
|
||||||
--
|
--
|
||||||
-- @
|
-- @
|
||||||
-- #!\/usr\/bin\/env runhaskell
|
-- #!\/usr\/bin\/env stack
|
||||||
|
-- \-\- stack \-\-resolver lts-2.9 \-\-install-ghc runghc \-\-package turtle
|
||||||
|
-- \
|
||||||
-- -- #!\/bin\/bash
|
-- -- #!\/bin\/bash
|
||||||
-- {-\# LANGUAGE OverloadedStrings \#-} --
|
-- {-\# LANGUAGE OverloadedStrings \#-} --
|
||||||
-- --
|
-- --
|
||||||
|
@ -709,7 +718,8 @@ import Turtle
|
||||||
-- descriptive error message if an external command fails:
|
-- descriptive error message if an external command fails:
|
||||||
--
|
--
|
||||||
-- @
|
-- @
|
||||||
-- #!\/usr\/bin\/env runhaskell
|
-- #!\/usr\/bin\/env stack
|
||||||
|
-- \-\- stack \-\-resolver lts-2.9 \-\-install-ghc runghc \-\-package turtle
|
||||||
--
|
--
|
||||||
-- {-\# LANGUAGE OverloadedStrings \#-}
|
-- {-\# LANGUAGE OverloadedStrings \#-}
|
||||||
--
|
--
|
||||||
|
@ -758,7 +768,7 @@ import Turtle
|
||||||
-- What's neat is that the compiler will automatically infer the number of
|
-- What's neat is that the compiler will automatically infer the number of
|
||||||
-- arguments and their types from the `Format` string:
|
-- arguments and their types from the `Format` string:
|
||||||
--
|
--
|
||||||
-- > $ ghci
|
-- > $ stack ghci
|
||||||
-- > Prelude Turtle> :type format (s%" failed with exit code: "%d)
|
-- > Prelude Turtle> :type format (s%" failed with exit code: "%d)
|
||||||
-- > format (s%" failed with exit code: "%d) :: Text -> Int -> Text
|
-- > format (s%" failed with exit code: "%d) :: Text -> Int -> Text
|
||||||
--
|
--
|
||||||
|
@ -966,7 +976,9 @@ import Turtle
|
||||||
--
|
--
|
||||||
-- We can use `select` to implement loops within a `Shell`:
|
-- We can use `select` to implement loops within a `Shell`:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
|
-- >
|
||||||
-- > -- #!/bin/bash
|
-- > -- #!/bin/bash
|
||||||
-- > {-# LANGUAGE OverloadedStrings #-} --
|
-- > {-# LANGUAGE OverloadedStrings #-} --
|
||||||
-- > --
|
-- > --
|
||||||
|
@ -1081,7 +1093,9 @@ import Turtle
|
||||||
-- Let's combine `stdin` and `stdout` to forward all input from standard input
|
-- Let's combine `stdin` and `stdout` to forward all input from standard input
|
||||||
-- to standard output:
|
-- to standard output:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
|
-- >
|
||||||
-- > -- #!/bin/bash
|
-- > -- #!/bin/bash
|
||||||
-- > {-# LANGUAGE OverloadedStrings #-} --
|
-- > {-# LANGUAGE OverloadedStrings #-} --
|
||||||
-- > --
|
-- > --
|
||||||
|
@ -1320,7 +1334,8 @@ import Turtle
|
||||||
-- ... and here is an example of creating a temporary directory and file within
|
-- ... and here is an example of creating a temporary directory and file within
|
||||||
-- a `Shell`:
|
-- a `Shell`:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
-- >
|
-- >
|
||||||
-- > {-# LANGUAGE OverloadedStrings #-}
|
-- > {-# LANGUAGE OverloadedStrings #-}
|
||||||
-- >
|
-- >
|
||||||
|
@ -1345,7 +1360,8 @@ import Turtle
|
||||||
-- As an exercise, try inserting an exception and verifying that the temporary:
|
-- As an exercise, try inserting an exception and verifying that the temporary:
|
||||||
-- file and directory are still cleaned up correctly:
|
-- file and directory are still cleaned up correctly:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
-- >
|
-- >
|
||||||
-- > {-# LANGUAGE OverloadedStrings #-}
|
-- > {-# LANGUAGE OverloadedStrings #-}
|
||||||
-- >
|
-- >
|
||||||
|
@ -1409,7 +1425,8 @@ import Turtle
|
||||||
-- For example, if you want to write a @cp@-like script that takes two
|
-- For example, if you want to write a @cp@-like script that takes two
|
||||||
-- positional arguments for the source and destination file, you can write:
|
-- positional arguments for the source and destination file, you can write:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
-- >
|
-- >
|
||||||
-- > -- cp.hs
|
-- > -- cp.hs
|
||||||
-- >
|
-- >
|
||||||
|
@ -1473,7 +1490,8 @@ import Turtle
|
||||||
-- optional, defaulting to `stdout` if the user does not provide a destination:
|
-- optional, defaulting to `stdout` if the user does not provide a destination:
|
||||||
--
|
--
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
-- >
|
-- >
|
||||||
-- > {-# LANGUAGE OverloadedStrings #-}
|
-- > {-# LANGUAGE OverloadedStrings #-}
|
||||||
-- >
|
-- >
|
||||||
|
@ -1520,7 +1538,8 @@ import Turtle
|
||||||
-- input and output using the @--src@ and @--dest@ flags, using @-s@ and @-d@
|
-- input and output using the @--src@ and @--dest@ flags, using @-s@ and @-d@
|
||||||
-- as short-hands for the flags:
|
-- as short-hands for the flags:
|
||||||
--
|
--
|
||||||
-- > #!/usr/bin/env runhaskell
|
-- > #!/usr/bin/env stack
|
||||||
|
-- > -- stack --resolver lts-2.9 --install-ghc runghc --package turtle
|
||||||
-- >
|
-- >
|
||||||
-- > {-# LANGUAGE OverloadedStrings #-}
|
-- > {-# LANGUAGE OverloadedStrings #-}
|
||||||
-- >
|
-- >
|
||||||
|
|
Loading…
Reference in a new issue