Resugaring: Lifting Evaluation Sequences through Syntactic Sugar - - PowerPoint PPT Presentation

resugaring lifting evaluation sequences through syntactic
SMART_READER_LITE
LIVE PREVIEW

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


slide-1
SLIDE 1

Resugaring: Lifting Evaluation Sequences through Syntactic Sugar

Justin Pombrio, Shriram Krishnamurthi Brown University

slide-2
SLIDE 2

2

Syntactic Sugar

slide-3
SLIDE 3

3

Syntactic Sugar

desugar

x + 2 x . _ _ a d d _ _ ( 2 )

slide-4
SLIDE 4

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

slide-5
SLIDE 5

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

slide-6
SLIDE 6

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

slide-7
SLIDE 7

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

slide-8
SLIDE 8

8

Big surface language Small core

desugar

slide-9
SLIDE 9

9

Big surface language Small core

desugar

slide-10
SLIDE 10

10

Code analyzer Refactoring engine Evaluator Big surface language Small core

desugar

slide-11
SLIDE 11

11

Code analyzer Refactoring engine Evaluator Big surface language Small core

desugar

slide-12
SLIDE 12

12

Code analyzer Refactoring engine Evaluator Big surface language Small core Evaluator

desugar

slide-13
SLIDE 13

13

Core Surface

n

  • t

( t r u e )

  • r

t r u e

slide-14
SLIDE 14

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

slide-15
SLIDE 15

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

slide-16
SLIDE 16

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

slide-17
SLIDE 17

17

Confection

core eval seq surface eval seq →

slide-18
SLIDE 18

18

slide-19
SLIDE 19

19

92 steps

slide-20
SLIDE 20

20

92 steps 7 steps

slide-21
SLIDE 21

21

Core Surface Resugaring: Running sugar in reverse

n

  • t

( t r u e )

  • r

t r u e

slide-22
SLIDE 22

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

slide-23
SLIDE 23

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

slide-24
SLIDE 24

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

slide-25
SLIDE 25

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

slide-26
SLIDE 26

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

slide-27
SLIDE 27

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

slide-28
SLIDE 28

28

THREE KEY PROPERTIES OF RESUGARING

slide-29
SLIDE 29

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

slide-30
SLIDE 30

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

slide-31
SLIDE 31

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

slide-32
SLIDE 32

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

slide-33
SLIDE 33

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

slide-34
SLIDE 34

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

slide-35
SLIDE 35

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

slide-36
SLIDE 36

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

slide-37
SLIDE 37

37

x

  • r

y

  • >

l e t t = x i n i f t t h e n t e l s e y

slide-38
SLIDE 38

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

slide-39
SLIDE 39

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

slide-40
SLIDE 40

40

A Little Theory

expand : Surf Term Core Term → unexpand : Core Term × Surf Term Surf Term →

slide-41
SLIDE 41

41

A Little Theory

expand : Surf Term Core Term → unexpand : Core Term × Surf Term Surf Term →

It's a lens!

slide-42
SLIDE 42

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

slide-43
SLIDE 43

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

slide-44
SLIDE 44

44

Key Properties

Emulation Abstraction Coverage

slide-45
SLIDE 45

45

Key Properties

Emulation (Lens Laws) Abstraction Coverage

slide-46
SLIDE 46

46

Key Properties

Emulation (Lens Laws) Abstraction (T agging – see paper) Coverage

slide-47
SLIDE 47

47

Key Properties

Emulation (Lens Laws) Abstraction (T agging – see paper) Coverage (Empirical)

slide-48
SLIDE 48

48

A WORKING SYSTEM

slide-49
SLIDE 49

49

92 steps 7 steps

slide-50
SLIDE 50

50

Core Surface

(

  • r

( a n d # t # f ) # f )

slide-51
SLIDE 51

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 ) )

slide-52
SLIDE 52

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 ) )

slide-53
SLIDE 53

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 ) )

slide-54
SLIDE 54

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

slide-55
SLIDE 55

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

slide-56
SLIDE 56

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

slide-57
SLIDE 57

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

slide-58
SLIDE 58

58

  • 1. Redex semantics engineering tool
  • 2. Racket (racket.org)
  • 3. Pyret (pyret.org)
slide-59
SLIDE 59

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

slide-60
SLIDE 60

60

slide-61
SLIDE 61

61

BACKUP SLIDES

slide-62
SLIDE 62

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?

slide-63
SLIDE 63

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

slide-64
SLIDE 64

64

s1

Surface

c1 c2 c3 s2

Core

How do we make this transparent?

val

val

desugar resugar resugar

slide-65
SLIDE 65

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
slide-66
SLIDE 66

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 ( [ ] )

slide-67
SLIDE 67

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

. Klint, and F . Tip. Origin tracking. Journal of Symbolic Computation, 15(5–6), 1993.