X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=docs%2Fusers_guide%2Fghci.xml;h=7c3fed2e8b5b0902db94349d6141dd5d7340e7ca;hb=3bb700d515de2405fa5db3326482e529f332d508;hp=1f20df4aab682abf69bc5151e09f53700abfb003;hpb=d1984e439154e95b2804ee83897e740b1713c53d;p=ghc-hetmet.git diff --git a/docs/users_guide/ghci.xml b/docs/users_guide/ghci.xml index 1f20df4..7c3fed2 100644 --- a/docs/users_guide/ghci.xml +++ b/docs/users_guide/ghci.xml @@ -28,8 +28,11 @@ $ ghci -GHCi, version 6.8.1: http://www.haskell.org/ghc/ :? for help +GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help +Loading package ghc-prim ... linking ... done. +Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. +Loading package ffi-1.0 ... linking ... done. Prelude> @@ -55,8 +58,52 @@ Prelude> GHCi interprets the whole line as an expression to evaluate. - The expression may not span several lines - as soon as you press - enter, GHCi will attempt to evaluate it. + The expression may not span several lines - as soon as you press enter, + GHCi will attempt to evaluate it. + + GHCi also has a multiline mode, + :set +m, + which is terminated by an empty line: + + +Prelude> :set +m +Prelude> let x = 42 in x / 9 +Prelude| +4.666666666666667 +Prelude> + + + In Haskell, a let expression is followed + by in. However, in GHCi, since the expression + can also be interpreted in the IO monad, + a let binding with no accompanying + in statement can be signalled by an empty line, + as in the above example. + + Multiline mode is useful when entering monadic + do statements: + + +Control.Monad.State> flip evalStateT 0 $ do +Control.Monad.State| i <- get +Control.Monad.State| lift $ do +Control.Monad.State| putStrLn "Hello World!" +Control.Monad.State| print i +Control.Monad.State| +"Hello World!" +0 +Control.Monad.State> + + + During a multiline interaction, the user can interrupt and + return to the top-level prompt. + + +Prelude> do +Prelude| putStrLn "Hello, World!" +Prelude| ^C +Prelude> + @@ -302,12 +349,29 @@ Ok, modules loaded: A, B, C, D. confusion, because non-exported top-level definitions of a module are only available for use in expressions at the prompt when the module is interpreted (see ). For - this reason, if you ask GHCi to load a filename rather than a - module name (e.g. :load Main.hs rather than - :load Main) then any existing object file will - be ignored and the module will be interpreted rather than - compiled. Using -fobject-code disables this - behaviour (see ). + this reason, you might sometimes want to force GHCi to load a + module using the interpreter. This can be done by prefixing + a * to the module name or filename when + using :load, for example + + +Prelude> :load *A +Compiling A ( A.hs, interpreted ) +*A> + + +When the * is used, GHCi ignores any + pre-compiled object code and interprets the module. If you have + already loaded a number of modules as object code and decide that + you wanted to interpret one of them, instead of re-loading the whole + set you can use :add *M to specify that you want + M to be interpreted (note that this might cause + other modules to be interpreted too, because compiled modules cannot + depend on interpreted ones). + +To always compile everything to object code and never use the + interpreter, use the -fobject-code option (see + ). HINT: since GHCi will only use a compiled object file if it can be sure that the compiled version is up-to-date, a good technique @@ -552,9 +616,9 @@ Compiling Main ( Main.hs, interpreted ) NOTE: for technical reasons, GHCi can only support the *-form for modules that are interpreted. Compiled modules and package modules can only contribute their - exports to the current scope. This is why GHCi will always - interpret, not compile, a module if you specify its filename - rather than its module name to :load. + exports to the current scope. To ensure that GHCi loads the + interpreted version of a module, add the * + when loading the module, e.g. :load *M. The scope is manipulated using the :module command. For example, if the current @@ -569,10 +633,12 @@ hello Prelude IO> - (Note: you can use import M as an - alternative to :module +M, and + (Note: you can use conventional + haskell import syntax as + well, but this does not support + * forms). :module can also be shortened to - :m). The full syntax of the + :m. The full syntax of the :module command is: @@ -797,16 +863,16 @@ it <- e ghci> reverse [] What should GHCi do? Strictly speaking, the program is ambiguous. show (reverse []) - (which is what GHCi computes here) has type Show a => a and how that displays depends + (which is what GHCi computes here) has type Show a => String and how that displays depends on the type a. For example: - ghci> (reverse []) :: String + ghci> reverse ([] :: String) "" - ghci> (reverse []) :: [Int] + ghci> reverse ([] :: [Int]) [] However, it is tiresome for the user to have to specify the type, so GHCi extends Haskell's type-defaulting - rules (Section 4.3.4 of the Haskell 98 Report (Revised)) as follows. The + rules (Section 4.3.4 of the Haskell 2010 Report) as follows. The standard rules take each group of constraints (C1 a, C2 a, ..., Cn a) for each type variable a, and defaults the type variable if @@ -1477,7 +1543,7 @@ a :: a *Main> :set -fbreak-on-exception *Main> :trace qsort ("abc" ++ undefined) -"Stopped at <exception thrown> +“Stopped at <exception thrown> _exception :: e [<exception thrown>] *Main> :hist -1 : qsort.hs:3:24-38 @@ -1762,13 +1828,16 @@ $ ghci -lm - :add module ... + :add *module ... :add Add module(s) to the current target set, and perform a - reload. + reload. Normally pre-compiled code for the module will be + loaded if available, or otherwise the module will be + compiled to byte-code. Using the * + prefix forces the module to be loaded as byte-code. @@ -1918,8 +1987,7 @@ maybe :: b -> (a -> b) -> Maybe a -> b used, respectively. Tags for all the functions, constructors and types in the currently loaded modules are created. All modules must be interpreted for these commands to work. - See also . - + @@ -2139,7 +2207,7 @@ Prelude> :. cmds.ghci - :load module ... + :load *module ... :load @@ -2156,6 +2224,11 @@ Prelude> :. cmds.ghci to unload all the currently loaded modules and bindings. + Normally pre-compiled code for a module will be loaded + if available, or otherwise the module will be compiled to + byte-code. Using the * prefix forces a + module to be loaded as byte-code. + After a :load command, the current context is set to: @@ -2306,6 +2379,29 @@ bar + :run + :run + + + See :main. + + + + + + :script n + filename + :script + + + Executes the lines of a file as a series of GHCi commands. This command + is compatible with multiline statements as set by :set +m + + + + + + :set option... :set @@ -2361,7 +2457,9 @@ bar Inside prompt, the sequence %s is replaced by the names of the modules currently in scope, and %% is - replaced by %. + replaced by %. If prompt + starts with " then it is parsed as a Haskell String; + otherwise it is treated as a literal string. @@ -2586,6 +2684,18 @@ bar + +m + +m + + + Enable parsing of multiline commands. A multiline command + is prompted for when the current input line contains open layout + contexts. + + + + + +r +r CAFsin GHCi @@ -2881,6 +2991,13 @@ Prelude> :set -fno-glasgow-exts because this is normally what you want in an interpreter: output appears as it is generated. + + If you want line-buffered behaviour, as in GHC, you can + start your program thus: + + main = do { hSetBuffering stdout LineBuffering; ... } + + @@ -2890,7 +3007,6 @@ Prelude> :set -fno-glasgow-exts