the weird world of bi-directional programmingbcpierce/papers/lenses-etapsslides.pdf · the weird...
TRANSCRIPT
![Page 1: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/1.jpg)
The Weird World ofBi-Directional Programming
Benjamin C. Pierce
Microsoft Research, Cambridge(on leave from University of Pennsylvania)
March, 2006
![Page 2: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/2.jpg)
The View Update Problem
I We apply a function to transform source to target
I Someone updates target
I We must now “translate” this update to obtain anappropriately updated source
S T
![Page 3: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/3.jpg)
The View Update Problem
I We apply a function to transform source to target
I Someone updates target
I We must now “translate” this update to obtain anappropriately updated source
S T
UpdatedT
update
![Page 4: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/4.jpg)
The View Update Problem
I We apply a function to transform source to target
I Someone updates target
I We must now “translate” this update to obtain anappropriately updated source
S T
UpdatedT
UpdatedS
![Page 5: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/5.jpg)
The View Update Problem
I We apply a function to transform source to target
I Someone updates target
I We must now “translate” this update to obtain anappropriately updated source
S T
UpdatedT
UpdatedS
recombine old S with new T
![Page 6: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/6.jpg)
The View Update Problem: Terminology
Let’s call the function from source to target get and the otherputback. The two functions together form a lens.
S (source structures)
T(target structures)
get
putback
lens
![Page 7: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/7.jpg)
The View Update Problem In Practice
This is called the view update problem in the database literature.
Database ViewView definition
Update translation policy
![Page 8: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/8.jpg)
The View Update Problem In Practice
This problem arises in many contexts besides “straight”databases — for example in editors for structured documents...
Document Screen presentation
edit operationon screen
Updated document
![Page 9: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/9.jpg)
The View Update Problem In Practice
...and data synchronizers such as the Harmony system beingbuilt at the University of Pennsylvania.
source in format B
source in format ACommon target
Synchronized source in format A
synchronize
Synchronized source in format B
![Page 10: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/10.jpg)
Why is This Hard?
![Page 11: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/11.jpg)
A Simple Solution?
We can “solve” the problem just by sticking together twoarbitrary functions of appropriate types, each writtenseparately in any programming language you like.
But this is tricky to get right... and even trickier to maintain!
“Thou shalt not repeat thyself in thy code!”
![Page 12: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/12.jpg)
A Simple Non-Solution
We can “solve” the problem just by sticking together twoarbitrary functions of appropriate types, each writtenseparately in any programming language you like.
But this is tricky to get right... and even trickier to maintain!
“Thou shalt not repeat thyself in thy code!”
![Page 13: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/13.jpg)
A Simple Non-Solution
We can “solve” the problem just by sticking together twoarbitrary functions of appropriate types, each writtenseparately in any programming language you like.
But this is tricky to get right... and even trickier to maintain!
“Thou shalt not repeat thyself in thy code!”
![Page 14: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/14.jpg)
A Simple Non-Solution
We can “solve” the problem just by sticking together twoarbitrary functions of appropriate types, each writtenseparately in any programming language you like.
But this is tricky to get right... and even trickier to maintain!
“Thou shalt not repeat thyself in thy code!”
Need to find a way of deriving both functions from a singledescription.
![Page 15: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/15.jpg)
A Class of Simple Solutions
Things become easier if we restrict attention to bijectivetransformations.
![Page 16: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/16.jpg)
A Class of Simple Solutions
Things become easier if we restrict attention to bijectivetransformations. Lots of success stories...
I xsugar [Møller and Braband]
I bijective macro tree transducers [Hosoya]
I correspondences and structuring schemas for XML[Abiteboul, Cluet, and Milo]
I pickling combinators [Kennedy]
I embedded interpreters [Benton]
I updatable views of o-o databases [Ohori and Tajima]
I inter-compilation between Jekyll and C [Ennals]
I etc., etc., etc.
![Page 17: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/17.jpg)
From Bijectiveness to Bi-Directionality
But bijectiveness is a strong restriction.
Often the whole point of defining a “view” is to hide someinformation that is present in the source!
I presenting just a small part of a huge database
I ignoring ordering of records when synchronizing XMLdatabases
I etc.
=⇒ Also important to address the more general“bi-directional” case, where the putback function weavesupdates back into the original source.
![Page 18: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/18.jpg)
Constructivism
Another issue: It is not enough to know that a putback exists.
I E.g., even in the bijective case, just giving the getfunction and proving, somehow, that it is bijective doesn’tdo the whole job.
We need a description that allows us to compute both get andputback functions.
(This is why the bijective case is already interesting!)
![Page 19: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/19.jpg)
Constructivism
Possible approaches:
I Monolithic:I programmer writes get function in some standard
notation (e.g., SQL)I read off its semantics in some formI from this, calculate an appropriate putback
I Compositional:I Build complex bi-directional transformations from
simpler bi-directional components.
![Page 20: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/20.jpg)
Monolithic Approaches
Problem:
I In general, the get direction may not provide enoughinformation to determine the putback function(More on this later...)
Possible solutions:
I Restrict the set of get functions to ones with “obvious”putback functions [e.g., Oracle “updatable views”]
I Put an ordering on the possible results of the putbackand look for an algorithm that finds the best [e.g.,Buneman, Khanna, and Tan]
I Restrict the set of update operations (e.g., tosingle-record insertions or deletions) [Hu, Mu, andTakeichi]
![Page 21: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/21.jpg)
Compositional Approaches
I Build complex bi-directional transformations by combiningsimpler bi-directional transformations
I I.e., design languages in which every program can beread...
from left to right as a get functionfrom right to left as a putback function
I Compositional reasoning about lens properties
I Type systems play a crucial role
I well-typedness =⇒ “reasonableness”I well-typedness of components (plus simple local
reasoning) =⇒ well-typedness of compound expression
![Page 22: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/22.jpg)
Compositional Approaches
I Build complex bi-directional transformations by combiningsimpler bi-directional transformations
I I.e., design languages in which every program can beread...
from left to right as a get functionfrom right to left as a putback function
I Compositional reasoning about lens properties
I Type systems play a crucial role
I well-typedness =⇒ “reasonableness”I well-typedness of components (plus simple local
reasoning) =⇒ well-typedness of compound expression
![Page 23: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/23.jpg)
Harmony
In the Harmony group at Penn, we have applied thiscompositional approach in two concrete domains:
I a language for bi-directional tree transformations
I a language for updatable relational views
![Page 24: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/24.jpg)
Today
A guided tour of this weird world.
Goals:
I To give a sense of the design space of bi-directionallanguages
I To illustrate a particular point in this space (Harmony’slanguage of bi-directional tree transformations) andsketch some of its interesting structures
![Page 25: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/25.jpg)
Harmony Demo
![Page 26: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/26.jpg)
The Design Space
![Page 27: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/27.jpg)
What is an “Update”?
Before we can talk about what it means to translate anupdate, we must first say precisely what we mean by anupdate.
S
UpdatedT
UpdatedS
T
Is it...
I the new state of T
I a (mathematical) function from T to T?
I a (syntactic) program denoting such a function?
![Page 28: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/28.jpg)
What is an “Update”?
Before we can talk about what it means to translate anupdate, we must first say precisely what we mean by anupdate.
S
UpdatedT
UpdatedS
T
Is it...
I the new state of T
I a (mathematical) function from T to T?
I a (syntactic) program denoting such a function?
![Page 29: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/29.jpg)
What is an “Update”?
Before we can talk about what it means to translate anupdate, we must first say precisely what we mean by anupdate.
S
UpdatedT
UpdatedS
T
Is it...
I the new state of T
I a (mathematical) function from T to T?
I a (syntactic) program denoting such a function?
![Page 30: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/30.jpg)
What is an “Update”?
Before we can talk about what it means to translate anupdate, we must first say precisely what we mean by anupdate.
S
UpdatedT
UpdatedS
T
Is it...
I the new state of T
I a (mathematical) function from T to T?
I a (syntactic) program denoting such a function?
![Page 31: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/31.jpg)
What is an “Update”?
Before we can talk about what it means to translate anupdate, we must first say precisely what we mean by anupdate.
S
UpdatedT
UpdatedS
Tinsert name=John, age=39delete records with age > 35change John's age to 40change Fred's age to 38delete Fred
Is it...
I the new state of T
I a (mathematical) function from T to T?
I a (syntactic) program denoting such a function?
![Page 32: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/32.jpg)
What is an “Update”?
All of these are sensible answers.
Tradeoffs:
I state-based approach (update = new state):
+ mathematically simpler+ describes “loosely coupled” systems: update translator
need not know what operation was applied — just itsresult
I operation-based approaches (update = function /program):
+ more expressive / flexible+ directly captures intuition of “manipulating (small)
deltas to (huge) databases”
For this talk, we’ll adopt the simpler state-based approach.
![Page 33: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/33.jpg)
Lenses (Formally)
A lens between a set of source structures S and a set of targetstructures T is a pair of functions
get from S to Tputback from T × S to S
T
lens
putback
get S
![Page 34: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/34.jpg)
A Sample Lens
Xml.flatten;
hoist "contacts"; List.hd []; hoist "contact";
List.map (mapp "n" (List.hd []; hoist "pcdata";
List.hd []);
pivot "n");
List.flatten;
map (List.hd [];
map (List.map (hoist "pcdata"; List.hd []));
acond [] (const [] ) (hoist "studio"))
![Page 35: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/35.jpg)
What is a “Reasonable” Lens?
To design a nice programming language, we need some designprinciples to
I allow us to recognize and reject bad (unreasonable)primitives and bad (non-reasonableness-preserving)combining forms
I give users a means to understand and predict thebehavior of programs in our language
![Page 36: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/36.jpg)
An Unreasonable Example
![Page 37: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/37.jpg)
An Unreasonable Example
foo 0 foo
project out string component
![Page 38: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/38.jpg)
An Unreasonable Example
foo 0
bar
foo
![Page 39: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/39.jpg)
An Unreasonable Example
foo 0
blech 5 bar
foo
return a constant
![Page 40: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/40.jpg)
An Unreasonable Example
foo 0
blech 5 bar
foo
blech
≠
![Page 41: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/41.jpg)
Acceptability
Principle:
Updates should be “translated exactly” — i.e., to asource structure for which get yields exactly theupdated target structure.
Formally:get(putback(t, s)) = t
![Page 42: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/42.jpg)
Another Unreasonable Example
foo 5 foo
project out string component
![Page 43: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/43.jpg)
Another Unreasonable Example
foo 5
bar
foo
![Page 44: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/44.jpg)
Another Unreasonable Example
foo 5
bar 0 bar
foo
propagate updated string
always set numeric field to 0
![Page 45: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/45.jpg)
Another Unreasonable Example
foo 5
foo
foo
=
![Page 46: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/46.jpg)
Another Unreasonable Example
foo 5
foo 0 foo
foo
=≠
![Page 47: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/47.jpg)
Stability
Principle:
If the target does not change, neither should thesource.
Formally:putback(get(s), s) = s
![Page 48: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/48.jpg)
A Debatable Example
foo 0 foo
project out string component
![Page 49: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/49.jpg)
A Debatable Example
foo 0
bar
foo
![Page 50: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/50.jpg)
A Debatable Example
foo 0
bar 1 bar
foo
increment numeric componentif string component has changed
![Page 51: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/51.jpg)
A Debatable Example
foo 0
bar 1
quux
bar
foo
![Page 52: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/52.jpg)
A Debatable Example
foo 0
bar 1
quux 2 quux
bar
foo
translated updates produce"side effects" on source
![Page 53: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/53.jpg)
A Debatable Example
foo 0
bar 1
foo
bar
foo
restore original target
![Page 54: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/54.jpg)
A Debatable Example
foo 0
bar 1
foo 2 foo
bar
foo
original source is not restored
![Page 55: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/55.jpg)
Forgetfulness
Principle:
Each update should completely overwrite the effectof the previous one. Thus, the effect of two putbacksin a row should be the same as just the second.
Formally:putback(t2, putback(t1, s)) = putback(t2, s)
Nice properties:
I Implies that S is isomorphic to T × U for some U
I Bancilhon and Spyratos’s notion of preserving a “constantcomplement” is a slight refinement of this.
Seems sensible. But do we want to require it of all lenses?
![Page 56: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/56.jpg)
Forgetfulness
Principle:
Each update should completely overwrite the effectof the previous one. Thus, the effect of two putbacksin a row should be the same as just the second.
Formally:putback(t2, putback(t1, s)) = putback(t2, s)
Nice properties:
I Implies that S is isomorphic to T × U for some U
I Bancilhon and Spyratos’s notion of preserving a “constantcomplement” is a slight refinement of this.
Seems sensible. But do we want to require it of all lenses?
![Page 57: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/57.jpg)
More Examples To Think About
foo 3
bar 5
baz 8
foo 3
baz 8
select green
records
![Page 58: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/58.jpg)
More Examples To Think About
foo 3
bar 5
baz 8
foo 3
baz 8
foo 3
select green
records
delete baz
![Page 59: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/59.jpg)
More Examples To Think About
foo 3
bar 5
baz 8
foo 3
baz 8
foo 3
bar 5foo 3
select green
records
delete baz
![Page 60: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/60.jpg)
More Examples To Think About
foo 3
bar 5
baz 8
foo 3
baz 8
foo 3
bar 5
foo 3
baz 8
foo 3
select green
records
delete baz
restore baz
![Page 61: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/61.jpg)
More Examples To Think About
foo 3
bar 5
baz 8
foo 3
baz 8
foo 3
bar 5
foo 3
bar 5
baz 8
foo 3
baz 8
foo 3
select green
records
delete baz
restore baz
back to original source
![Page 62: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/62.jpg)
More Examples To Think About
foo 3
bar 5
baz 8
foo
baz
select green
records and
delete numbers
![Page 63: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/63.jpg)
More Examples To Think About
foo 3
bar 5
baz 8
foo
baz
foo
select green
records and
delete numbers
delete baz
![Page 64: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/64.jpg)
More Examples To Think About
foo 3
bar 5
baz 8
foo
baz
foo 3
bar 5foo
select green
records and
delete numbers
delete baz
![Page 65: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/65.jpg)
More Examples To Think About
foo 3
bar 5
baz 8
foo
baz
foo 3
bar 5foo
select green
records and
delete numbers
delete baz
restore baz
foo
baz
![Page 66: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/66.jpg)
More Examples To Think About
foo 3
bar 5
baz 8
foo
baz
foo 3
bar 5
foo 3
bar 5
baz 0
foo
select green
records and
delete numbers
delete baz
restore baz
foo
baz
number set to some default
![Page 67: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/67.jpg)
What To Do?
Should we...
I Demand forgetfulness and lose the ability to handledeletion in some cases?
I Not demand forgetfulness and lose the guarantee ofundoability?
Better: keep both as possibilities
I Do not demand forgetfulness of all lenses
I But provide a way to easily check that it holds inparticular cases
![Page 68: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/68.jpg)
What To Do?
Should we...
I Demand forgetfulness and lose the ability to handledeletion in some cases?
I Not demand forgetfulness and lose the guarantee ofundoability?
Better: keep both as possibilities
I Do not demand forgetfulness of all lenses
I But provide a way to easily check that it holds inparticular cases
![Page 69: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/69.jpg)
Another Special Case: Bijective Lenses
A lens whose putback function ignores its second (source)argument is called bijective.
Too strong for many applications.
But nice when it holds!
I behavior very predictable and easy to understand
I simplifies notations (allowing defaults to be omitted, etc.)
Again, we should keep both possibilities open:
I do not demand bijectiveness of all lenses
I but provide a way to tell when it holds
![Page 70: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/70.jpg)
A Lens Bestiary
bijective lenses
acceptable lenses
well-behaved and forgetful (very well behaved) lenses
all lenses
acceptable and stable(well-behaved) lenses
Also, if we had time: partial, monotone, ...
![Page 71: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/71.jpg)
A Lens Bestiary
bijective lenses
acceptable lenses
well-behaved and forgetful (very well behaved) lenses
all lenses
acceptable and stable(well-behaved) lenses
"Reason
able"
Also, if we had time: partial, monotone, ...
![Page 72: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/72.jpg)
A Lens Bestiary
bijective lenses
acceptable lenses
well-behaved and forgetful (very well behaved) lenses
all lenses
acceptable and stable(well-behaved) lenses
"Reason
able"
Also, if we had time: partial, monotone, ...
![Page 73: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/73.jpg)
Notation: Lens Types
Swb⇐⇒ T well-behaved lenses from S to T
Svwb⇐⇒ T very well behaved lenses from S to T
Sbij⇐⇒ T bijective lenses from S to T
Sα⇐⇒ T lenses with property α ∈ wb, vwb, bij
![Page 74: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/74.jpg)
How Many Putbacks?
To deepen intuitions about these different subclasses ofreasonable lenses, let’s try a little visualization exercise...
![Page 75: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/75.jpg)
How Many Putbacks? (Bijective Case)
S
T
A bijective lens defines a one-to-one correspondence betweenS and T .
![Page 76: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/76.jpg)
How Many Putbacks? (Bijective Case)
S
T
The behavior of the putback function is thus completely fixedby the behavior of get.
![Page 77: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/77.jpg)
How Many Putbacks? (Very Well Behaved Case)
S
T
If we are defining a very well behaved lens, then manystructures from S can map onto the same structure from T .
![Page 78: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/78.jpg)
How Many Putbacks? (Very Well Behaved Case)
S
T
Source structures partitioned by the equivalence relation
s1 ∼ s2 ⇐⇒ get(s1) = get(s2)
![Page 79: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/79.jpg)
How Many Putbacks? (Very Well Behaved Case)
S
T
The get function projects out part of the information in thesource structure...
![Page 80: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/80.jpg)
How Many Putbacks? (Very Well Behaved Case)
S
T
The get function projects out part of the information in thesource structure... and throws away the rest.
![Page 81: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/81.jpg)
How Many Putbacks? (Very Well Behaved Case)
S
T
If the target structure is modified. . .
![Page 82: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/82.jpg)
How Many Putbacks? (Very Well Behaved Case)
S
T
If the target structure is modified. . .
![Page 83: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/83.jpg)
How Many Putbacks? (Very Well Behaved Case)
S
T
If the target structure is modified. . . the “target part” of thenew source structure is fixed by acceptability...
![Page 84: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/84.jpg)
How Many Putbacks? (Very Well Behaved Case)
S
T
If the target structure is modified. . . the “target part” of thenew source structure is fixed by acceptability... and the“projected away part” is fixed by forgetfulness to be exactlythe one from the original source.
![Page 85: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/85.jpg)
How Many Putbacks? (Well-Behaved Case)
S
T
?? ?
However, if we are defining a well-behaved lens, the behaviorof putback is constrained only by acceptability.
Many putbacks to choose from!
![Page 86: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/86.jpg)
How Many Putbacks? (Well-Behaved Case)
S
T
Need extra information to select one.
![Page 87: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/87.jpg)
Lenses for Trees
![Page 88: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/88.jpg)
Lenses for Trees
The rest of the talk focuses on Harmony’s language forbi-directional tree transformations.
Applications include:
I mappings from various XML/HTML bookmark forms to acommon “abstract bookmark” schema
I mappings between calendar formats (icalendar, palmcalendar)
I mappings between address book formats (xcard, csv)
I (under construction) translators for XMI files, drawings,bibtex files, MS Access databases, ...
![Page 89: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/89.jpg)
Overview
I Generic lensesI identity, composition, conditionals, recursion
I Structure manipulation lensesI Lenses that modify the shape of the tree near the rootI hoist, plunge, pivot, . . .
I Tree navigation lensesI Apply different lenses to different parts of the tree, or
one lens deeper in the treeI map, fork, . . .
I “Database-like” lensesI flatten, join, . . .
I Structure replication lensesI merge, copy, . . .
![Page 90: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/90.jpg)
Trees
Core data model: unordered, edge-labeled trees with noduplicate edge labels at a given node.
(I.e., a tree is just a partial function from labels to subtrees.)
fred
gingerfox.net
paramount.com
More complex concrete data formats (lists, XML, etc.) arestraightforwardly encoded as unordered trees.
![Page 91: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/91.jpg)
Tree Types
Types are sets of trees.
=⇒ Type algebra based on regular tree types is a natural fit.
Notation:
T ::= n 7→ T child named n with subtree in T! 7→ T child with any name and subtree in T* 7→ T any number of children with subtrees in TT1 • T2 concatenation of T1 and T2
. . . (plus some others we don’t need today)
![Page 92: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/92.jpg)
The Identity Lens
The identity is a bijective lens from any set U to itself.
id ∈ Ubij⇐⇒ U
Source Target
![Page 93: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/93.jpg)
The Identity Lens
The identity is a bijective lens from any set U to itself.
id ∈ Ubij⇐⇒ U
U U
Source Target
![Page 94: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/94.jpg)
Lens Composition
If l ∈ Sα⇐⇒ U and k ∈ U
α⇐⇒ T then
(l ; k) ∈ Sα⇐⇒ T
l
T
S
k
T
U
Source Target
![Page 95: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/95.jpg)
Lens Composition
If l ∈ Sα⇐⇒ U and k ∈ U
α⇐⇒ T then
(l ; k) ∈ Sα⇐⇒ T
l
T
k
getl ;k(s) = getk(getl(s))
![Page 96: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/96.jpg)
Lens Composition
If l ∈ Sα⇐⇒ U and k ∈ U
α⇐⇒ T then
(l ; k) ∈ Sα⇐⇒ T
l
T
k
putbackl ;k(t, s) = putbackl(putbackk(t, getl(s)), s)
![Page 97: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/97.jpg)
Hoist
hoist ∈n 7→ U
bij⇐⇒ U
n
Source Target
The get function hoists the child under n.
The putback function restores the edge n.
![Page 98: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/98.jpg)
The Constant Lens (first version)
Source Target
t
The get function discards the entire source structure andalways yields the tree t.
![Page 99: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/99.jpg)
The Constant Lens (first version)
Source Target
t
The get function discards the entire source structure andalways yields the tree t.
The putback function restores the original source structure.
![Page 100: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/100.jpg)
Map
map l applies a lens l to all the children of the root node
map
l
m n
o m n
o
m n
pm n
p
Ω
![Page 101: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/101.jpg)
Map
map l ∈* 7→ S
wb⇐⇒* 7→ T
if l∈S
wb⇐⇒ T
map
l
m n
o m n
o
m n
pm n
p
Ω
![Page 102: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/102.jpg)
Map
map l ∈* 7→ S
wb⇐⇒* 7→ T
The get direction replicates the source structure. . .
map
l
m on
o
mn
![Page 103: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/103.jpg)
Map
map l ∈* 7→ S
wb⇐⇒* 7→ T
The get direction replicates the source structure. . .
and applies l to every child
map
l
m n
o m n
o
![Page 104: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/104.jpg)
Map
map l ∈* 7→ S
wb⇐⇒* 7→ T
The get direction replicates the source structure. . .
and applies l to every child
map
l
m n
o m n
o
![Page 105: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/105.jpg)
Map
map l ∈* 7→ S
wb⇐⇒* 7→ T
The get direction replicates the source structure. . .
and applies l to every child
map
l
m n
o m n
o
![Page 106: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/106.jpg)
Map
map l ∈* 7→ S
wb⇐⇒* 7→ T
The putback direction replicates the target structure. . .
map
l
m n
o
m n
p
n
p
m
![Page 107: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/107.jpg)
Map
map l ∈* 7→ S
wb⇐⇒* 7→ T
The putback direction replicates the target structure. . .
and applies l to every child using the source trees
map
l
m n
o
m n
pm n
p
![Page 108: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/108.jpg)
Map
map l ∈* 7→ S
wb⇐⇒* 7→ T
The putback direction replicates the target structure. . .
and applies l to every child using the source trees
map
l
m n
o
m n
pm n
p
![Page 109: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/109.jpg)
Map
map l ∈* 7→ S
wb⇐⇒* 7→ T
The putback direction replicates the target structure. . .
deleting children that are absent
map
l
m n
o
m n
pm n
p
![Page 110: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/110.jpg)
Map
map l ∈* 7→ S
wb⇐⇒* 7→ T
The putback direction replicates the target structure. . .
creating new children, using which source tree?
map
l
m n
o
m n
pm n
p
?
![Page 111: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/111.jpg)
Map
map l ∈* 7→ S
wb⇐⇒* 7→ T
The putback direction replicates the target structure. . .
creating new children, using the special “missing tree” Ω
map
l
m n
o
m n
pm n
p
Ω
![Page 112: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/112.jpg)
Map (alternate typing)
map l ∈* 7→ S
vwb⇐⇒* 7→ T
if l∈S
bij⇐⇒ T
map
l
m n
o m n
o
m n
pm n
p
Ω
![Page 113: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/113.jpg)
Creation
Doing putback(t, Ω) corresponds to creating an element of Sgiven just an element t ∈ T .
Formally, we enrich the source and target of all lenses with theelement Ω.
Lenses whose get functions discard information (like const)now need to be extended to handle Ω (by providing defaults).
![Page 114: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/114.jpg)
Pivot
pivot k ∈ k 7→ ! 7→ • Ubij⇐⇒ ! 7→ U
pivot k performs fetches the key under k and puts it at theroot of the tree.
k
key
key
Typical use: choose a key before a flatten...
![Page 115: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/115.jpg)
Pivot
pivot k ∈ k 7→ ! 7→ • Ubij⇐⇒ ! 7→ U
pivot k performs fetches the key under k and puts it at theroot of the tree.
k
key
key
Typical use: choose a key before a flatten...
![Page 116: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/116.jpg)
Flatten
flatten ∈ List(! 7→ U) wb⇐⇒ * 7→ List(U)
The flatten lens takes a list of keyed trees and flattens itinto a tree of lists, where the top-level children are the keysfrom the original list:
m n o
m n o get n
putback: exercise!
![Page 117: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/117.jpg)
Conditional
Any serious language needs some kind of conditional.
How could this work in a bi-directional setting?
Critical issue: How do we ensure reasonableness, when all weknow about the two branches of the conditional is that each isreasonable by itself (i.e., if both get and putback go throughthe same branch)?
![Page 118: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/118.jpg)
Conditional
Any serious language needs some kind of conditional.
How could this work in a bi-directional setting?
Critical issue: How do we ensure reasonableness, when all weknow about the two branches of the conditional is that each isreasonable by itself (i.e., if both get and putback go throughthe same branch)?
![Page 119: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/119.jpg)
Conditional: get direction
Choose a lens depending on some propertyof the structure
In the get direction: test the source structure(i.e., check if s ∈ Sc ⊆ S)
cond
l1 l2
l1 ∈ Scα⇐⇒ T1 l2 ∈ Sc
α⇐⇒ T2
What about the way back?
![Page 120: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/120.jpg)
Conditional: get direction
Choose a lens depending on some propertyof the structureIn the get direction: test the source structure(i.e., check if s ∈ Sc ⊆ S) co
nd S
c
l1 l2
l1 ∈ Scα⇐⇒ T1 l2 ∈ Sc
α⇐⇒ T2
What about the way back?
![Page 121: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/121.jpg)
Conditional: get direction
Choose a lens depending on some propertyof the structureIn the get direction: test the source structure(i.e., check if s ∈ Sc ⊆ S) co
nd S
c
l1 l2
s
l1 ∈ Scα⇐⇒ T1 l2 ∈ Sc
α⇐⇒ T2
What about the way back?
![Page 122: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/122.jpg)
Conditional: get direction
Choose a lens depending on some propertyof the structureIn the get direction: test the source structure(i.e., check if s ∈ Sc ⊆ S) co
nd S
c
s
l1 l2
∈ Sc
l1 ∈ Scα⇐⇒ T1
l2 ∈ Scα⇐⇒ T2
What about the way back?
![Page 123: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/123.jpg)
Conditional: get direction
Choose a lens depending on some propertyof the structureIn the get direction: test the source structure(i.e., check if s ∈ Sc ⊆ S) co
nd S
c
l1 l2
s ∉ Sc
l1 ∈ Scα⇐⇒ T1 l2 ∈ Sc
α⇐⇒ T2
What about the way back?
![Page 124: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/124.jpg)
Conditional: get direction
Choose a lens depending on some propertyof the structureIn the get direction: test the source structure(i.e., check if s ∈ Sc ⊆ S) co
nd S
c
l1 l2
s ∉ Sc
l1 ∈ Scα⇐⇒ T1 l2 ∈ Sc
α⇐⇒ T2
What about the way back?
![Page 125: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/125.jpg)
Conditional: ccond
l1get
l2get
t
Sc
Sc
T
putback
s
putback
Choose according to the source argument
![Page 126: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/126.jpg)
Conditional: ccond
l1get
l2get
t
t'
Sc
Sc
T
putback
s
putback
Choose according to the source argument
![Page 127: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/127.jpg)
Conditional: ccond
l1get
l2get
t
t'
Sc
Sc
Ts'
putback
s
putback
Choose according to the source argument
![Page 128: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/128.jpg)
Conditional: acond
Sc
T1l1
putback
get
l2get
T2
ts
putbackSc
Another alternative: Choose according to the target argument
![Page 129: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/129.jpg)
Conditional: acond
l1
putback
get
l2get
ts
t'
putback
Sc
T1
T2Sc
But what about switching domains?
![Page 130: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/130.jpg)
Conditional: acond
l1
putback
get
l2get
ts
t'
Sc
T1
T2
s'
Sc
?
putback
A source structure from Sc is needed. . .
![Page 131: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/131.jpg)
Conditional: acond
l1
putback
get
l2get
ts
s' t'
putback
Sc
T1
T2
Ω
Sc
Consider it as creation
![Page 132: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/132.jpg)
Conditional: The General Case
l1
Sc
T1
putback
get
T2
t
s
tmp
f12
putback
s'
t'
Sc
get
Combine both and use a fix up function instead of Ω.
![Page 133: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/133.jpg)
Going Further
Derived forms for a wide variety of more complextransformations can be implemented in terms of theseprimitives.
I more complex structure manipulations
I list processing (map, reverse, filter, group, ...)
I XML processing
I etc., etc.
![Page 134: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/134.jpg)
Lenses For Relations
![Page 135: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/135.jpg)
Quick Sketch
Data model: source and target structures are relationaldatabases (named collections of tables)
Primitives: Operators from relational algebra, each augmentedwith enough parameters to determine putback behavior.
Type system: Built using standard tools from databases
I predicates on rows of tables
I functional dependencies between columns (restricted to“tree form”)
See our upcoming PODS 2006 paper for more.
![Page 136: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/136.jpg)
Finishing Up. . .
![Page 137: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/137.jpg)
Related Work
I Semantic Framework — many related ideas in databaseliterature (see paper)
I [Dayal, Bernstein ’82] “exact translation”I [Bancilhon, Spryatos ’81] “translators under constant
complement”I [Gottlob, Paolini, Zicari ’88] “dynamic views”
I Bijective and Reversible Languages (lots)
I Bi-Directional LanguagesI [Meertens] — language for constaint maintainers; similar
behavioral lawsI [Hu, Mu, Takeichi ’04] — language at core of a
structured document editor
![Page 138: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/138.jpg)
Harmony Status
I Prototype implementation and several demo applicationsworking well
I Distributed operation via integration with Unison filesynchronizer
I Starting to be used seriously outside of PennI We’re looking for more users... Join the fun!
I Extensive set of demos (including a lens programmingplayground) available on the web
![Page 139: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/139.jpg)
Ongoing and Future Work
I More / larger applications
I Formal characterizations of expressivenessI Is this set of primitives complete in some interesting
sense?
I Programming puzzlesI can flatten be written as a derived form?I can a linear-time reverse be written as a derived form?
I Algorithmic aspects of static typechecking with tree types
I Relational lenses / database integration
I Lenses over other structures (graphs, streams, ...)
I Lens programming by example (i.e., much higher-levellanguages sharing the same semantic basis)
![Page 140: The Weird World of Bi-Directional Programmingbcpierce/papers/lenses-etapsslides.pdf · The Weird World of Bi-Directional Programming ... single-record insertions or deletions)](https://reader031.vdocument.in/reader031/viewer/2022020412/5af944db7f8b9ae92b8c29d8/html5/thumbnails/140.jpg)
Thank You!
Mail collaborators on this work: Aaron Bohannon, NateFoster, Michael Greenwald, Alan Schmitt, Jeff Vaughan
Other Harmony contributors: Malo Denielou, MichaelGreenwald, Owen Gunden, Martin Hofmann, Sanjeev Khanna,Keshav Kunal, Stephane Lescuyer, Jon Moore, Zhe Yang
Resources: Papers, slides, (open source) code, and onlinedemos:
http://www.cis.upenn.edu/∼bcpierce/harmony/