Lifting Evaluation Sequences Through Syntactic Sugar

Lifting Evaluation Sequences Through Syntactic Sugar

Resugaring: Lifting Evaluation Sequences through Syntactic Sugar Justin Pombrio, Shriram Krishnamurthi Brown University Syntactic Sugar 2 Syntactic Sugar x + 2 desugar x.__add__(2) 3 Syntactic Sugar x + 2 desugar x.__add__(2) [x*x | x <- lst] desugar map (\x -> x*x) lst 4 Syntactic Sugar x + 2 desugar x.__add__(2) [x*x | x <- lst] desugar map (\x -> x*x) lst x or y desugar let t = x in if t then t else y 5 Surface language (what you write) Syntactic Sugar x + 2 desugar x.__add__(2) [x*x | x <- lst] desugar map (\x -> x*x) lst x or y desugar let t = x in if t then t else y 6 Surface language Core language (what you write) Syntactic Sugar (what runs) x + 2 desugar x.__add__(2) [x*x | x <- lst] desugar map (\x -> x*x) lst x or y desugar let t = x in if t then t else y 7 Big surface language desugar Small core 8 Big surface language desugar Small core 9 Big surface language desugar Code analyzer Small core Refactoring engine Evaluator 10 Big surface language desugar Code analyzer Small core Refactoring engine Evaluator 11 Big surface language desugar Code analyzer Small core Refactoring engine Evaluator 12 Surface Core not(tr!e) or tr!e 13 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in if t t en t else true 14 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in if t t en t else true let t = false in if t t en t else true if false t en false else true true 15 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in if t t en t else true false or tr!e let t = false in if t t en t else true if false t en false else true tr!e true 16 Confection core eval seq → surface eval seq 17 18 92 steps 19 92 steps 7 steps 20 Surface Core not(tr!e) or tr!e Resugaring: Running sugar in reverse 21 Surface Core not(tr!e) or tr!e false or tr!e tr!e Resugaring: Running sugar in reverse 22 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in if t t en t else true false or tr!e tr!e Resugaring: Running sugar in reverse 23 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in if t t en t else true false or tr!e let t = false in if t t en t else true if false t en false else true tr!e true Resugaring: Running sugar in reverse 24 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in resugar if t t en t else true false or tr!e let t = false in if t t en t else true if false t en false else true tr!e true Resugaring: Running sugar in reverse 25 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in resugar if t t en t else true resugar false or tr!e let t = false in if t t en t else true if false t en false else true tr!e true Resugaring: Running sugar in reverse 26 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in resugar if t t en t else true resugar false or tr!e let t = false in if t t en t else true resugar if false t en false else true tr!e true Resugaring: Running sugar in reverse 27 THREE KEY PROPERTIES OF RESUGARING 28 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in if t t en t else true resugar let t = false in if t t en t else true 29 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in if t t en t else true tr!e or tr!e resugar let t = false in or tr!e if t t en t else true 30 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in if t t en t else true tr!e or tr!e resugar let t = false in or tr!e if t t en t else true Emulation Each surface term must desugar to the core term it purports to represent 31 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in if t t en t else true resugar let t = false in if t t en t else true 32 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in if t t en t else true let t = false in resugar let t = false in if t t en t else true if t t en t else true 33 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in if t t en t else true let t = false in resugar let t = false in if t t en t else true if t t en t else true Abstraction Show things in terms of a sugar precisely when the programmer used that sugar. 34 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in if t t en t else true resugar let t = false in if t t en t else true resugar if false t en false else true resugar tr!e true 35 Surface Core desugar not(tr!e) or tr!e let t = not(tr!e) in if t t en t else true Coverage resugar let t = false in if t t en t else true Show as many steps resugar as possible if false t en false else true resugar tr!e true 36 x or y -> let t = x in if t then t else y 37 expand match substitute x or y -> let t = x in if t then t else y 38 expand match substitute x or y -> let t = x in if t then t else y substitute match unexpand 39 A Little Theory expand : Surf Term → Core Term unexpand : Core Term × Surf Term → Surf Term 40 A Little Theory expand : Surf Term → Core Term unexpand : Core Term × Surf Term → Surf Term It's a lens! 41 A Little Theory expand : Surf Term → Core Term unexpand : Core Term × Surf Term → Surf Term It's a lens! unexpand (expand T) T = T GetPut GetPut expand (unexpand T’ T) = T’ PutGet PutGet 42 A Little Theory expand : Surf Term → Core Term unexpand : Core Term × Surf Term → Surf Term It's a lens! unexpand (expand T) T = T GetPut GetPut expand (unexpand T’ T) = T’ PutGet PutGet Well-formedness criteria on rules ensure these laws. 43 Key Properties Emulation Abstraction Coverage 44 Key Properties Emulation (Lens Laws) Abstraction Coverage 45 Key Properties Emulation (Lens Laws) Abstraction (Tagging – see paper) Coverage 46 Key Properties Emulation (Lens Laws) Abstraction (Tagging – see paper) Coverage (Empirical) 47 A WORKING SYSTEM 48 92 steps 7 steps 49 Surface Core (or (and #t #f) #f) 50 Surface Core desugar (or (and #t #f) #f) ((lambda (t) (begin (if t t ((lambda () #f))))) (if #t ((lambda () #f)) #f)) 51 Surface Core desugar (or (and #t #f) #f) ((lambda (t) (begin (if t t ((lambda () #f))))) (if #t ((lambda () #f)) #f)) ((lambda (t) (begin (if t t ((lambda () #f))))) ((lambda () #f))) ((lambda (t) (begin (if t t ((lambda () #f))))) #f) (if #f t ((lambda () #f))) ((lambda () #f)) #f 52 Surface Core desugar (or (and #t #f) #f) ((lambda (t) (begin (if t t ((lambda () #f))))) (if #t ((lambda () #f)) #f)) (or #f #f) ((lambda (t) (begin (if t t ((lambda () #f))))) ((lambda () #f))) (or #f) ((lambda (t) (begin (if t t ((lambda () #f))))) #f) (if #f t ((lambda () #f))) ((lambda () #f)) #f #f 53 Surface Core my-list = [2] cases(List) my-list: | empty() => print("empty") | link(something, _) => print("not empty") end 54 Surface Core my-list = [2] desugar my-list = list.["lin)(](2, list.["empty"]) cases(List) my-list: bloc)' | empty() => print("empty") tempM,-./,01 :: List = my-list | link(something, _) => tempM,-./,01.["_match"]({ print("not empty") "empty" : fun(): print("empty") end* end "link" : fun(something, _): print("not empty") end 3* fun(): raise("cases: no cases mat% ed") end) end 55 Surface Core my-list = [2] desugar my-list = list.["lin)(](2, list.["empty"]) cases(List) my-list: bloc)' | empty() => print("empty") tempM,-./,01 :: List = my-list | link(something, _) => tempM,-./,01.["_match"]({ print("not empty") "empty" : fun(): print("empty") end* end "link" : fun(something, _): print("not empty") end 3* fun(): raise("cases: no cases mat% ed") end) end my-list = obj.["link"](2, list.["empty"]) my-list = <func>(2, []) block: block: tempMODRIOUJ :: List = my-list tempMODRIOUJ :: List = my-list tempMODRIOUJ.["_match"]({"empty" : fun(): print("empty") end, tempMODRIOUJ.["_match"]({"empty" : fun(): print("empty") "link" : fun(something, _): print("not empty") end}, fun(): end, "link" : fun(something, _): print("not empty") end}, raise("cases: no cases matched") end) fun(): raise("cases: no cases matched") end) end end my-list = obj.["link"](2, list.["empty"]) my-list = [2] block: block: tempMODRIOUJ :: List = my-list tempMODRIOUJ :: List = my-list tempMODRIOUJ.["_match"]({"empty" : fun(): print("empty") end, tempMODRIOUJ.["_match"]({"empty" : fun(): print("empty") "link" : fun(something, _): print("not empty") end}, fun(): end, "link" : fun(something, _): print("not empty") end}, raise("cases: no cases matched") end) fun(): raise("cases: no cases matched") end) end end my-list = <func>(2, list.["empty"]) tempMODRIOUJ :: List = [2] block: tempMODRIOUJ.["_match"]({"empty" : fun(): print("empty") tempMODRIOUJ :: List = my-list end, "link" : fun(something, _): print("not empty") end}, tempMODRIOUJ.["_match"]({"empty" : fun(): print("empty") end, fun(): raise("cases: no cases matched") end) "link" : fun(something, _): print("not empty") end}, fun(): raise("cases: no cases matched") end) [2].["_match"]({"empty" : fun(): print("empty") end, end "link" : fun(something, _): print("not empty") end}, fun(): raise("cases: no cases matched") end) my-list = <func>(2, obj.["empty"]) block: [2].["_match"]({"empty" : fun(): print("empty") end, tempMODRIOUJ :: List = my-list "link" : fun(something, _): print("not empty") end}, fun(): tempMODRIOUJ.["_match"]({"empty" : fun(): print("empty") end, raise("cases: no cases matched") end) "link" : fun(something, _): print("not empty") end}, fun(): raise("cases: no cases matched") end) <func>({"empty" : fun(): end, "link" : fun(something, _): end print("not empty") end}, fun(): raise("cases: no cases matched") end) my-list = <func>(2, obj.["empty"]) block: <func>({"empty" : fun(): end, "link" : fun(): end}, fun(): tempMODRIOUJ :: List = my-list raise("cases: no cases matched") end) tempMODRIOUJ.["_match"]({"empty" : fun(): print("empty") end, "link" : fun(something, _): print("not empty") end}, fun(): <func>(obj, fun(): raise("cases: no cases matched") end) raise("cases:

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    67 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us