X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=docs%2Fusers_guide%2Fglasgow_exts.xml;h=8a213683e4edfdd881f2acdb97b9ddfbebdac50b;hp=f9cb3f7bf0847d56181b6c0951813906273980c0;hb=f2dcf256399e9a2de6343c625630b51f8abf4863;hpb=8382f3ad690ab5c26bc3866f9b024bc7a2bc6308 diff --git a/docs/users_guide/glasgow_exts.xml b/docs/users_guide/glasgow_exts.xml index f9cb3f7..8a21368 100644 --- a/docs/users_guide/glasgow_exts.xml +++ b/docs/users_guide/glasgow_exts.xml @@ -5989,6 +5989,74 @@ r) -> + +Special built-in functions +GHC has a few built-in funcions with special behaviour, +described in this section. All are exported by +GHC.Exts. + + The <literal>inline</literal> function + +The inline function is somewhat experimental. + + inline :: a -> a + +The call (inline f) arranges that f +is inlined, regardless of its size. More precisely, the call +(inline f) rewrites to the right-hand side of f's +definition. +This allows the programmer to control inlining from +a particular call site +rather than the definition site of the function +(c.f. INLINE pragmas ). + + +This inlining occurs regardless of the argument to the call +or the size of f's definition; it is unconditional. +The main caveat is that f's definition must be +visible to the compiler. That is, f must be +let-bound in the current scope. +If no inlining takes place, the inline function +expands to the identity function in Phase zero; so its use imposes +no overhead. + + If the function is defined in another +module, GHC only exposes its inlining in the interface file if the +function is sufficiently small that it might be +inlined by the automatic mechanism. There is currently no way to tell +GHC to expose arbitrarily-large functions in the interface file. (This +shortcoming is something that could be fixed, with some kind of pragma.) + + + + The <literal>inline</literal> function + +The lazy function restrains strictness analysis a little: + + lazy :: a -> a + +The call (lazy e) means the same as e, +but lazy has a magical property so far as strictness +analysis is concerned: it is lazy in its first argument, +even though its semantics is strict. After strictness analysis has run, +calls to lazy are inlined to be the identity function. + + +This behaviour is occasionally useful when controlling evaluation order. +Notably, lazy is used in the library definition of +Control.Parallel.par: + + par :: a -> b -> b + par x y = case (par# x) of { _ -> lazy y } + +If lazy were not lazy, par would +look strict in y which would defeat the whole +purpose of par. + + + + + Generic classes