X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fmaster-project%2Freport.git;a=blobdiff_plain;f=Core2Core.tex;h=b404a03a74ea3e538f1d15b6f79fbc381b8608bb;hp=1f258d31028dd4466749f542c9523ffabe2df490;hb=c4abca08c46358134e3f73b2904293ef7a21b8b7;hpb=204e3063cbdc2825e3f78ae0261dbf30d4cf38e0 diff --git a/Core2Core.tex b/Core2Core.tex index 1f258d3..b404a03 100644 --- a/Core2Core.tex +++ b/Core2Core.tex @@ -260,6 +260,9 @@ is specified as a number of conditions (above the horizontal line) and a number of conclusions (below the horizontal line). The details of using this notation are still a bit fuzzy, so comments are welcom. +TODO: Formally describe the "apply to every (sub)expression" in terms of +rules with full transformations in the conditions. + \subsection{η-abstraction} This transformation makes sure that all arguments of a function-typed expression are named, by introducing lambda expressions. When combined with @@ -600,6 +603,38 @@ translatable. A user-defined function is any other function. TODO: The above definition looks too complicated... Can we find something more concise? +\subsection{Cast propagation} +This transform pushes casts down into the expression as far as possible. +\subsection{Let recursification} +This transform makes all lets recursive. +\subsection{Let simplification} +This transform makes the result value of all let expressions a simple +variable reference. +\subsection{Let flattening} +This transform turns two nested lets (\lam{let x = (let ... in ...) in +...}) into a single let. +\subsection{Simple let binding removal} +This transforms inlines simple let bindings (\eg a = b). +\subsection{Function inlining} +This transform inlines let bindings of a funtion type. TODO: This should +be generelized to anything that is non representable at runtime, or +something like that. +\subsection{Scrutinee simplification} +This transform ensures that the scrutinee of a case expression is always +a simple variable reference. +\subsection{Case binder wildening} +This transform replaces all binders of a each case alternative with a +wild binder (\ie, one that is never referred to). This will possibly +introduce a number of new "selector" case statements, that only select +one element from an algebraic datatype and bind it to a variable. +\subsection{Case value simplification} +This transform simplifies the result value of each case alternative by +binding the value in a let expression and replacing the value by a +simple variable reference. +\subsection{Case removal} +This transform removes any case statements with a single alternative and +only wild binders. + \subsection{Example sequence} This section lists an example expression, with a sequence of transforms