Current Research

In particular, I'm interested in designing PL-based abstractions for
settings in which humans and computers cooperate to create and process
information.

Incremental computations

consume and produce
information whose content or structure changes slowly over time
by small changes. In these settings, programs exploit cached
work from the past to respond more efficiently than naive
re-computation that is oblivious to past work.
Interactive computations are incremental computations that
reside in an open world, where future states are explored
collaboratively with an external user.
Common examples include spreadsheets, development environments and
media processing (graphics and sound).

Many prior programming-language-based approaches to incremental
computation, including self-adjusting computation, assume
a non-interactive model.
As it turns out, efficient interactive computation often requires
a demand-driven approach to caching past computation.

consists of
computation performed by mutually-distrusting agents; together, they
cooperatively compute functions over their private data, while only
ever learning certain prearranged results and while remaining
otherwise oblivious to the computational steps necessary to
produce them.

Background:
Self-adjusting computation is a family of related
programming-language-based techniques for incremental
computation. In broad terms, self-adjusting computations consume
and produce dynamically-changing data, and are described by programs
that appear to be conventional (non-incremental).