Tomas Petricek, Charles University, Prague



Environment for creating interactive textbooks
Spatial metaphor
Naive realism


Non-textual programming system based on copying
First-class copy&paste
Concrete programming


Literate programming environment for data science
Notebook with cells
Code, outputs, text


Hypermedia authoring system for end-users
Stacks of cards
User levels
HyperTalk language



What is the formal model?
Can we type check them?
What are their design choices?
Better support non-programmers
Support progression to expert
More open and transparent!




Merge edits made independently by different users

Specify program by showing concrete document action

Adapt references when document structure changes


Computational substrate for end-user document-oriented programming
Makes implementing
such systems easy!


Web-based end-user programming tool
Co-developed with the Denicek substrate
Six formative examples


Simple data science notebook system
Collaborative editing
Programming by demonstration
Incremental evaluation














One user changes the document structure


One user changes the document structure
Another user changes
data in the document
Can we merge the edits?


Linearize like rebase


Linearize like rebase


Linearize like rebase
Add data first, then change document structure is easy!


Linearize like rebase
Add data first, then change document structure is easy!


Linearize like rebase
Add data first, then change document structure is easy!
Change structure, then add new data is tricky!

Compute the current
document state
Turn branching into
a linear history
Report merge conflicts

Given \(E, E_1\) and \(E, E_2\) with a shared prefix \(E\):
\(\mathcal{M}_E(E_1, E_2) = E, E_1, E_2'\)
\(\mathcal{M}_E(E_2, E_1) = E, E_2, E_1'\)
Given \(e_1\) and \(e_2\), produce \(e_2', e_2'', \ldots\) that can be applied after \(e_1\)



Simply replay edits on top of the current history!


Simply replay edits on top of the current history!


Simply replay edits on top of the current history!
Does not work if the
document evolves...


Branch off from the original document version & merge


Branch off from the original document version & merge


Branch off from the original document version & merge
Merging logic adapts edits to the new schema






Naive realism
Boxer, Webstrates
Renderer with widgets
Jupyter, Forms/3
API calls
Ampleforth, Hypercard
Memory-mapped
BootstrapLab, (BASIC :-)


Ephemeral results
Spreadsheets, Jupyter
Materialized results
Hypercard, Webstrates
Internalized execution
Boxer, BootstrapLab
Materialized execution
Denicek, Subtext

Interesting kind of programming systems...
For user-centric and theory research
Ask me about Denicek and design choices
Tomas Petricek, Charles University, Prague
