  Programming language definitions assign formal meaning to complete programs.
Programmers, however, spend a substantial amount of time interacting with
incomplete programs -- programs with holes, type inconsistencies and binding
inconsistencies -- using tools like program editors and live programming
environments (which interleave editing and evaluation). Semanticists have done
comparatively little to formally characterize (1) the static and dynamic
semantics of incomplete programs; (2) the actions available to programmers as
they edit and inspect incomplete programs; and (3) the behavior of editor
services that suggest likely edit actions to the programmer based on semantic
information extracted from the incomplete program being edited, and from
programs that the system has encountered in the past. As such, each tool
designer has largely been left to develop their own ad hoc heuristics.
  This paper serves as a vision statement for a research program that seeks to
develop these "missing" semantic foundations. Our hope is that these
contributions, which will take the form of a series of simple formal calculi
equipped with a tractable metatheory, will guide the design of a variety of
current and future interactive programming tools, much as various lambda
calculi have guided modern language designs. Our own research will apply these
principles in the design of Hazel, an experimental live lab notebook
programming environment designed for data science tasks. We plan to co-design
the Hazel language with the editor so that we can explore concepts such as
edit-time semantic conflict resolution mechanisms and mechanisms that allow
library providers to install library-specific editor services.
