A semantic model of reference counting and its abstraction (detailed summary)

Most interpreters for functional languages (as well as Lisp) employ at some level in the implementation a notion of sharing, whether manifested indirectly through an environment or directly via pointers. Sharing is essential to an efficient implementation, saving time by not recomputing values, and saving space by having only one copy of each value. From the perspective of lambda calculus, sharing arises whenever a beta-reduction results in substitution for more than one occurrence of a particular bound variable.