No subject
Thu Sep 1 22:29:11 EDT 2011
Stephen Chang, Eli Barzilay, John Clements, Matthias Felleisen
Debugging lazy functional programs poses serious challenges. Due to the
complicated nature of lazy evaluation, some debugging tools abandon laziness
altogether. Other debuggers preserve laziness but present it in a way that may
confuse programmers because the focus of evaluation jumps around in a
seemingly random manner.
In this paper, we introduce the algebraic program stepper as a new debugging
tool for lazy programs. We conjecture that our tool is suitable for clarifying
the confusing nature of laziness. Preliminary classroom experiences have
confirmed a prototype implementation of the stepper as a useful tool for
novice programmers and programmers new to lazy programming.
Mathematically speaking, our stepper renders lazy computations as the standard
rewriting sequences of a program rewriting system. Our lazy semantics
introduces lazy evaluation as a form of parallel program rewriting. The
semantics resembles graph reduction but remains intuitive for programmers
because it emphasizes the source syntax. As a syntactic semantics, our
rewriting system represents a compromise between Launchbury's store-based
semantics and a simple, axiomatic description of lazy computation as
sharing-via-parameters. We prove an equivalence between our system and both
of these semantics.
The stepper's implementation leverages Racket's continuation marks for stack
trace generation. We can therefore exploit existing models of continuation
marks and a correctness proof of Racket's eager algebraic stepper to prove the
correctness of our lazy stepper.
More information about the PRL
mailing list