Resugaring: Lifting Evaluation Sequences through Syntactic Sugar - - PowerPoint PPT Presentation
Resugaring: Lifting Evaluation Sequences through Syntactic Sugar - - PowerPoint PPT Presentation
Resugaring: Lifting Evaluation Sequences through Syntactic Sugar Justin Pombrio, Shriram Krishnamurthi Brown University Syntactic Sugar 2 Syntactic Sugar desugar x + 2 x . _ _ a d d _ _ ( 2 ) 3 Syntactic Sugar desugar x
2
Syntactic Sugar
3
Syntactic Sugar
desugar
x + 2 x . _ _ a d d _ _ ( 2 )
4
Syntactic Sugar
desugar desugar
x + 2 x . _ _ a d d _ _ ( 2 ) [ x * x | x <
- l
s t ] m a p ( \ x
- >
x * x ) l s t
5
Syntactic Sugar
desugar desugar desugar
x + 2 x . _ _ a d d _ _ ( 2 ) [ x * x | x <
- l
s t ] m a p ( \ x
- >
x * x ) l s t x
- r
y l e t t = x i n i f t t h e n t e l s e y
6
Syntactic Sugar
Surface language (what you write)
desugar desugar desugar
x + 2 x . _ _ a d d _ _ ( 2 ) [ x * x | x <
- l
s t ] m a p ( \ x
- >
x * x ) l s t x
- r
y l e t t = x i n i f t t h e n t e l s e y
7
Syntactic Sugar
Surface language (what you write) Core language (what runs)
desugar desugar desugar
x + 2 x . _ _ a d d _ _ ( 2 ) [ x * x | x <
- l
s t ] m a p ( \ x
- >
x * x ) l s t x
- r
y l e t t = x i n i f t t h e n t e l s e y
8
Big surface language Small core
desugar
9
Big surface language Small core
desugar
10
Code analyzer Refactoring engine Evaluator Big surface language Small core
desugar
11
Code analyzer Refactoring engine Evaluator Big surface language Small core
desugar
12
Code analyzer Refactoring engine Evaluator Big surface language Small core Evaluator
desugar
13
Core Surface
n
- t
( t r u e )
- r
t r u e
14
Core Surface
desugar
n
- t
( t r u e )
- r
t r u e l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e
15
Core Surface
l e t t = f a l s e i n i f t t h e n t e l s e t r u e i f f a l s e t h e n f a l s e e l s e t r u e t r u e
desugar
n
- t
( t r u e )
- r
t r u e l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e
16
Core Surface
l e t t = f a l s e i n i f t t h e n t e l s e t r u e i f f a l s e t h e n f a l s e e l s e t r u e t r u e f a l s e
- r
t r u e t r u e
desugar
n
- t
( t r u e )
- r
t r u e l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e
17
Confection
core eval seq surface eval seq →
18
19
92 steps
20
92 steps 7 steps
21
Core Surface Resugaring: Running sugar in reverse
n
- t
( t r u e )
- r
t r u e
22
Core Surface Resugaring: Running sugar in reverse
n
- t
( t r u e )
- r
t r u e f a l s e
- r
t r u e t r u e
23
Core Surface
desugar
Resugaring: Running sugar in reverse
n
- t
( t r u e )
- r
t r u e f a l s e
- r
t r u e t r u e l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e
24
Core Surface
desugar
Resugaring: Running sugar in reverse
n
- t
( t r u e )
- r
t r u e f a l s e
- r
t r u e t r u e l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e l e t t = f a l s e i n i f t t h e n t e l s e t r u e i f f a l s e t h e n f a l s e e l s e t r u e t r u e
25
Core Surface
desugar
Resugaring: Running sugar in reverse
resugar
n
- t
( t r u e )
- r
t r u e f a l s e
- r
t r u e t r u e l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e l e t t = f a l s e i n i f t t h e n t e l s e t r u e i f f a l s e t h e n f a l s e e l s e t r u e t r u e
26
Core Surface
desugar resugar
Resugaring: Running sugar in reverse
resugar
n
- t
( t r u e )
- r
t r u e f a l s e
- r
t r u e t r u e l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e l e t t = f a l s e i n i f t t h e n t e l s e t r u e i f f a l s e t h e n f a l s e e l s e t r u e t r u e
27
Core Surface
desugar resugar
Resugaring: Running sugar in reverse
resugar resugar
n
- t
( t r u e )
- r
t r u e f a l s e
- r
t r u e t r u e l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e l e t t = f a l s e i n i f t t h e n t e l s e t r u e i f f a l s e t h e n f a l s e e l s e t r u e t r u e
28
THREE KEY PROPERTIES OF RESUGARING
29
Core Surface
l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e l e t t = f a l s e i n i f t t h e n t e l s e t r u e
desugar resugar
n
- t
( t r u e )
- r
t r u e
30
Core Surface
l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e l e t t = f a l s e i n i f t t h e n t e l s e t r u e
desugar resugar
n
- t
( t r u e )
- r
t r u e t r u e
- r
t r u e
- r
t r u e
31
Core Surface
l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e l e t t = f a l s e i n i f t t h e n t e l s e t r u e
desugar resugar
n
- t
( t r u e )
- r
t r u e Emulation
Each surface term must desugar to the core term it purports to represent
t r u e
- r
t r u e
- r
t r u e
32
Core Surface
l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e l e t t = f a l s e i n i f t t h e n t e l s e t r u e
desugar resugar
n
- t
( t r u e )
- r
t r u e
33
Core Surface
l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e l e t t = f a l s e i n i f t t h e n t e l s e t r u e l e t t = f a l s e i n i f t t h e n t e l s e t r u e
desugar resugar
n
- t
( t r u e )
- r
t r u e
34
Core Surface
l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e l e t t = f a l s e i n i f t t h e n t e l s e t r u e l e t t = f a l s e i n i f t t h e n t e l s e t r u e Abstraction
Show things in terms of a sugar precisely when the programmer used that sugar. desugar resugar
n
- t
( t r u e )
- r
t r u e
35
Core Surface
l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e l e t t = f a l s e i n i f t t h e n t e l s e t r u e i f f a l s e t h e n f a l s e e l s e t r u e t r u e n
- t
( t r u e )
- r
t r u e t r u e
desugar resugar resugar resugar
36
Core Surface
l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e l e t t = f a l s e i n i f t t h e n t e l s e t r u e i f f a l s e t h e n f a l s e e l s e t r u e t r u e n
- t
( t r u e )
- r
t r u e t r u e Coverage
Show as many steps as possible desugar resugar resugar resugar
37
x
- r
y
- >
l e t t = x i n i f t t h e n t e l s e y
38
x
- r
y
- >
l e t t = x i n i f t t h e n t e l s e y
expand
match substitute
39
x
- r
y
- >
l e t t = x i n i f t t h e n t e l s e y
expand unexpand
match substitute match substitute
40
A Little Theory
expand : Surf Term Core Term → unexpand : Core Term × Surf Term Surf Term →
41
A Little Theory
expand : Surf Term Core Term → unexpand : Core Term × Surf Term Surf Term →
It's a lens!
42
A Little Theory
expand : Surf Term Core Term → unexpand : Core Term × Surf Term Surf Term →
It's a lens! GetPut PutGet
unexpand (expand T) T = T expand (unexpand T’ T) = T’
GetPut PutGet
43
A Little Theory
expand : Surf Term Core Term → unexpand : Core Term × Surf Term Surf Term →
It's a lens! Well-formedness criteria on rules ensure these laws. GetPut PutGet
unexpand (expand T) T = T expand (unexpand T’ T) = T’
GetPut PutGet
44
Key Properties
Emulation Abstraction Coverage
45
Key Properties
Emulation (Lens Laws) Abstraction Coverage
46
Key Properties
Emulation (Lens Laws) Abstraction (T agging – see paper) Coverage
47
Key Properties
Emulation (Lens Laws) Abstraction (T agging – see paper) Coverage (Empirical)
48
A WORKING SYSTEM
49
92 steps 7 steps
50
Core Surface
(
- r
( a n d # t # f ) # f )
51
Core Surface
desugar (
- r
( a n d # t # f ) # f ) ( ( l a m b d a ( t ) ( b e g i n ( i f t t ( ( l a m b d a ( ) # f ) ) ) ) ) ( i f # t ( ( l a m b d a ( ) # f ) ) # f ) )
52 ( ( l a m b d a ( t ) ( b e g i n ( i f t t ( ( l a m b d a ( ) # f ) ) ) ) ) ( ( l a m b d a ( ) # f ) ) ) ( ( l a m b d a ( t ) ( b e g i n ( i f t t ( ( l a m b d a ( ) # f ) ) ) ) ) # f ) ( i f # f t ( ( l a m b d a ( ) # f ) ) ) ( ( l a m b d a ( ) # f ) ) # f
Core Surface
desugar (
- r
( a n d # t # f ) # f ) ( ( l a m b d a ( t ) ( b e g i n ( i f t t ( ( l a m b d a ( ) # f ) ) ) ) ) ( i f # t ( ( l a m b d a ( ) # f ) ) # f ) )
53 (
- r
# f # f ) (
- r
# f ) # f ( ( l a m b d a ( t ) ( b e g i n ( i f t t ( ( l a m b d a ( ) # f ) ) ) ) ) ( ( l a m b d a ( ) # f ) ) ) ( ( l a m b d a ( t ) ( b e g i n ( i f t t ( ( l a m b d a ( ) # f ) ) ) ) ) # f ) ( i f # f t ( ( l a m b d a ( ) # f ) ) ) ( ( l a m b d a ( ) # f ) ) # f
Core Surface
desugar (
- r
( a n d # t # f ) # f ) ( ( l a m b d a ( t ) ( b e g i n ( i f t t ( ( l a m b d a ( ) # f ) ) ) ) ) ( i f # t ( ( l a m b d a ( ) # f ) ) # f ) )
54
Core Surface
m y
- l
i s t = [ 2 ] c a s e s ( L i s t ) m y
- l
i s t : | e m p t y ( ) = > p r i n t ( " e m p t y " ) | l i n k ( s
- m
e t h i n g , _ ) = > p r i n t ( " n
- t
e m p t y " ) e n d
55
Core Surface
desugar
m y
- l
i s t = l i s t . [ " l i n k " ] ( 2 , l i s t . [ " e m p t y " ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t = [ 2 ] c a s e s ( L i s t ) m y
- l
i s t : | e m p t y ( ) = > p r i n t ( " e m p t y " ) | l i n k ( s
- m
e t h i n g , _ ) = > p r i n t ( " n
- t
e m p t y " ) e n d
56
m y
- l
i s t =
- b
j . [ " l i n k " ] ( 2 , l i s t . [ " e m p t y " ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t =
- b
j . [ " l i n k " ] ( 2 , l i s t . [ " e m p t y " ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t = < f u n c > ( 2 , l i s t . [ " e m p t y " ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t = < f u n c > ( 2 ,
- b
j . [ " e m p t y " ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t = < f u n c > ( 2 ,
- b
j . [ " e m p t y " ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t = < f u n c > ( 2 , [ ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t = [ 2 ] b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d t e m p M O D R I O U J : : L i s t = [ 2 ] t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) [ 2 ] . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) [ 2 ] . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) < f u n c > ( { " e m p t y " : f u n ( ) : e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) < f u n c > ( { " e m p t y " : f u n ( ) : e n d , " l i n k " : f u n ( ) : e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) < f u n c > (
- b
j , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) < f u n c > (
- b
j , f u n ( ) : e n d ) < f u n c > ( " n
- t
e m p t y " ) " n
- t
e m p t y "
Core Surface
desugar
m y
- l
i s t = l i s t . [ " l i n k " ] ( 2 , l i s t . [ " e m p t y " ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t = [ 2 ] c a s e s ( L i s t ) m y
- l
i s t : | e m p t y ( ) = > p r i n t ( " e m p t y " ) | l i n k ( s
- m
e t h i n g , _ ) = > p r i n t ( " n
- t
e m p t y " ) e n d
57
m y
- l
i s t = [ 2 ] c a s e s ( L i s t ) m y
- l
i s t : | e m p t y ( ) = > p r i n t ( " e m p t y " ) | l i n k ( s
- m
e t h i n g , _ ) = > p r i n t ( " n
- t
e m p t y " ) e n d c a s e s ( L i s t ) [ 2 ] : | e m p t y ( ) = > p r i n t ( " e m p t y " ) | l i n k ( s
- m
e t h i n g , _ ) = > p r i n t ( " n
- t
e m p t y " ) e n d < f u n c > ( " n
- t
e m p t y " ) " n
- t
e m p t y "
m y
- l
i s t =
- b
j . [ " l i n k " ] ( 2 , l i s t . [ " e m p t y " ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t =
- b
j . [ " l i n k " ] ( 2 , l i s t . [ " e m p t y " ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t = < f u n c > ( 2 , l i s t . [ " e m p t y " ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t = < f u n c > ( 2 ,
- b
j . [ " e m p t y " ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t = < f u n c > ( 2 ,
- b
j . [ " e m p t y " ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t = < f u n c > ( 2 , [ ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t = [ 2 ] b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d t e m p M O D R I O U J : : L i s t = [ 2 ] t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) [ 2 ] . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) [ 2 ] . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) < f u n c > ( { " e m p t y " : f u n ( ) : e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) < f u n c > ( { " e m p t y " : f u n ( ) : e n d , " l i n k " : f u n ( ) : e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) < f u n c > (
- b
j , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) < f u n c > (
- b
j , f u n ( ) : e n d ) < f u n c > ( " n
- t
e m p t y " ) " n
- t
e m p t y "
Core Surface
desugar
m y
- l
i s t = l i s t . [ " l i n k " ] ( 2 , l i s t . [ " e m p t y " ] ) b l
- c
k : t e m p M O D R I O U J : : L i s t = m y
- l
i s t t e m p M O D R I O U J . [ " _ m a t c h " ] ( { " e m p t y " : f u n ( ) : p r i n t ( " e m p t y " ) e n d , " l i n k " : f u n ( s
- m
e t h i n g , _ ) : p r i n t ( " n
- t
e m p t y " ) e n d } , f u n ( ) : r a i s e ( " c a s e s : n
- c
a s e s m a t c h e d " ) e n d ) e n d m y
- l
i s t = [ 2 ] c a s e s ( L i s t ) m y
- l
i s t : | e m p t y ( ) = > p r i n t ( " e m p t y " ) | l i n k ( s
- m
e t h i n g , _ ) = > p r i n t ( " n
- t
e m p t y " ) e n d
58
- 1. Redex semantics engineering tool
- 2. Racket (racket.org)
- 3. Pyret (pyret.org)
59
Resugaring
The Confection tool
- Declarative sugar specification
- Language agnostic
- Guarantees Emulation and Abstraction
Current/future work
- Hygiene!
- Better error messages
through resugaring
tinyurl.com/resugar
60
61
BACKUP SLIDES
62
How should this resugar? l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e t r u e
Looks like the desugaring of an ‘or’. But maybe the user wrote it?
63
- r
- r
Core Surface
l e t t = n
- t
( t r u e ) i n i f t t h e n t e l s e f a l s e l e t t = f a l s e i n i f t t h e n t e l s e f a l s e i f f a l s e t h e n f a l s e e l s e f a l s e f a l s e n
- t
( t r u e )
- r
f a l s e f a l s e
- r
f a l s e f a l s e
desugar resugar resugar resugar
64
s1
Surface
c1 c2 c3 s2
Core
How do we make this transparent?
…
val
…
val
desugar resugar resugar
65
Reconstruct the (core) program as source at each evaluation step (along with its tags). Either instrument the compiler
- r do a pre-compilation step
CPS/ANF makes this easier;
- r just statefully keep track of the stack
66
Max2 Max2
Core
desugar resugar
M a x ( [ ] )
- >
R a i s e ( “ e m p t y l i s t ” ) ; M a x ( x s )
- >
M a x A c c ( x s ,
- i
n f i n i t y ) ; M a x ( [
- i
n f i n i t y ] ) M a x A c c ( [
- i
n f i n i t y ] ,
- i
n f i n i t y ) M a x A c c ( [ ] ,
- i
n f i n i t y ) Surface M a x ( [ ] )
67
Related Work
- J. Hennessy. Symbolic debugging of optimized code.
Transactions on Programming Languages and Systems, 4(3), 1982.
- J. Clements, M. Flatt, and M. Felleisen. Modeling an
algebraic stepper. In European Symposium on Programming Languages and Systems, 2001.
- R. Perera, U. A. Acar, J. Cheney, and P
. B. Levy. Functional programs that explain their work. In International Conference on Functional Programming, 2012
- A. V. Deursen, P