  Over the past thirty years, there has been significant progress in developing
general-purpose, language-based approaches to incremental computation, which
aims to efficiently update the result of a computation when an input is
changed. A key design challenge in such approaches is how to provide efficient
incremental support for a broad range of programs. In this paper, we argue that
first-class names are a critical linguistic feature for efficient incremental
computation. Names identify computations to be reused across differing runs of
a program, and making them first class gives programmers a high level of
control over reuse. We demonstrate the benefits of names by presenting NOMINAL
ADAPTON, an ML-like language for incremental computation with names. We
describe how to use NOMINAL ADAPTON to efficiently incrementalize several
standard programming patterns -- including maps, folds, and unfolds -- and show
how to build efficient, incremental probabilistic trees and tries. Since
NOMINAL ADAPTON's implementation is subtle, we formalize it as a core calculus
and prove it is from-scratch consistent, meaning it always produces the same
answer as simply re-running the computation. Finally, we demonstrate that
NOMINAL ADAPTON can provide large speedups over both from-scratch computation
and ADAPTON, a previous state-of-the-art incremental computation system.
