% Install the lambda calculus pretty-printer, as defined in pret-lam.lua.
\installprettytype [LAM] [LAM]
+\definetyping[lambda][option=LAM,style=sans]
+
% An (invisible) frame to hold a lambda expression
\define[1]\lamframe{
% Put a frame around lambda expressions, so they can have multiple
Initial example
-\starttyping
- \x ->
+\startlambda
+ λx.
let s = foo x
in
case s of
Low -> let
op' = case b of
High -> sub
- Low -> \c d -> c
+ Low -> λc.λd.c
in
- \c d -> op' d c
-\stoptyping
+ λc.λd.op' d c
+\stoplambda
After top-level η-abstraction:
-\starttyping
- \x c d ->
+\startlambda
+ λx.λc.λd.
(let s = foo x
in
case s of
Low -> let
op' = case b of
High -> sub
- Low -> \c d -> c
+ Low -> λc.λd.c
in
- \c d -> op' d c
+ λc.λd.op' d c
) c d
-\stoptyping
+\stoplambda
After (extended) β-reduction:
-\starttyping
- \x c d ->
+\startlambda
+ λx.λc.λd.
let s = foo x
in
case s of
Low -> let
op' = case b of
High -> sub
- Low -> \c d -> c
+ Low -> λc.λd.c
in
op' d c
-\stoptyping
+\stoplambda
After return value extraction:
-\starttyping
- \x c d ->
+\startlambda
+ λx.λc.λd.
let s = foo x
r = case s of
(a, b) ->
Low -> let
op' = case b of
High -> sub
- Low -> \c d -> c
+ Low -> λc.λd.c
in
op' d c
in
r
-\stoptyping
+\stoplambda
Scrutinee simplification does not apply.
After case binder wildening:
-\starttyping
- \x c d ->
+\startlambda
+ λx.λc.λd.
let s = foo x
a = case s of (a, _) -> a
b = case s of (_, b) -> b
- r = case s of
- (_, _) ->
- case a of
- High -> add c d
- Low -> let
- op' = case b of
- High -> sub
- Low -> \c d -> c
- in
- op' d c
+ r = case s of (_, _) ->
+ case a of
+ High -> add c d
+ Low -> let op' = case b of
+ High -> sub
+ Low -> λc.λd.c
+ in
+ op' d c
in
r
-\stoptyping
+\stoplambda
After case value simplification
-\starttyping
- \x c d ->
+\startlambda
+ λx.λc.λd.
let s = foo x
a = case s of (a, _) -> a
b = case s of (_, b) -> b
- r = case s of
- (_, _) -> r'
+ r = case s of (_, _) -> r'
rh = add c d
- rl = let
- rll = \c d -> c
- op' = case b of
- High -> sub
- Low -> rll
- in
- op' d c
+ rl = let rll = λc.λd.c
+ op' = case b of
+ High -> sub
+ Low -> rll
+ in
+ op' d c
r' = case a of
High -> rh
Low -> rl
in
r
-\stoptyping
+\stoplambda
After let flattening:
-\starttyping
- \x c d ->
+\startlambda
+ λx.λc.λd.
let s = foo x
a = case s of (a, _) -> a
b = case s of (_, b) -> b
- r = case s of
- (_, _) -> r'
+ r = case s of (_, _) -> r'
rh = add c d
rl = op' d c
- rll = \c d -> c
+ rll = λc.λd.c
op' = case b of
High -> sub
Low -> rll
Low -> rl
in
r
-\stoptyping
+\stoplambda
After function inlining:
-\starttyping
- \x c d ->
+\startlambda
+ λx.λc.λd.
let s = foo x
a = case s of (a, _) -> a
b = case s of (_, b) -> b
- r = case s of
- (_, _) -> r'
+ r = case s of (_, _) -> r'
rh = add c d
rl = (case b of
High -> sub
- Low -> \c d -> c) d c
+ Low -> λc.λd.c) d c
r' = case a of
- High -> rh
- Low -> rl
+ High -> rh
+ Low -> rl
in
r
-\stoptyping
+\stoplambda
After (extended) β-reduction again:
-\starttyping
- \x c d ->
+\startlambda
+ λx.λc.λd.
let s = foo x
a = case s of (a, _) -> a
b = case s of (_, b) -> b
- r = case s of
- (_, _) -> r'
+ r = case s of (_, _) -> r'
rh = add c d
rl = case b of
High -> sub d c
Low -> d
r' = case a of
- High -> rh
- Low -> rl
+ High -> rh
+ Low -> rl
in
r
-\stoptyping
+\stoplambda
After case value simplification again:
-\starttyping
- \x c d ->
+\startlambda
+ λx.λc.λd.
let s = foo x
a = case s of (a, _) -> a
b = case s of (_, b) -> b
- r = case s of
- (_, _) -> r'
+ r = case s of (_, _) -> r'
rh = add c d
rlh = sub d c
rl = case b of
High -> rlh
Low -> d
r' = case a of
- High -> rh
- Low -> rl
+ High -> rh
+ Low -> rl
in
r
-\stoptyping
+\stoplambda
After case removal:
-\starttyping
- \x c d ->
+\startlambda
+ λx.λc.λd.
let s = foo x
a = case s of (a, _) -> a
b = case s of (_, b) -> b
High -> rlh
Low -> d
r' = case a of
- High -> rh
- Low -> rl
+ High -> rh
+ Low -> rl
in
r
-\stoptyping
+\stoplambda
After let bind removal:
-\starttyping
- \x c d ->
+\startlambda
+ λx.λc.λd.
let s = foo x
a = case s of (a, _) -> a
b = case s of (_, b) -> b
High -> rlh
Low -> d
r' = case a of
- High -> rh
- Low -> rl
+ High -> rh
+ Low -> rl
in
r'
-\stoptyping
+\stoplambda
Application simplification is not applicable.
\stoptext