Your extensive knowledge is always very helpful, John!
So, let us call the objects "locatives" instead. This also has the advantage that the getter can be reasonably named "locative-ref" as would be custom in Scheme.
On top of what I proposed (possibly minus the non-mutable locatives), specialized constructors should also be provided (and which may be implemented more efficiently by an implementation than by hand):
* (make-list-locative LIST INDEX)
* (make-vector-locative VECTOR INDEX)
* (make-string-locative STRING INDEX)
* (make-hash-table-locative HASH-TABLE KEY DEFAULT)
* (make-hashtable-locative HASHTABLE KEY DEFAULT)
* (make-car-locative PAIR)
* (make-cdr-locative PAIR)
* (make-record-locative RECORD FIELD-INDEX)
On top of that, I would propose syntax like
* (define-place <IDENTIFIER> <LOCATIVE-EXPRESSION>)
which binds <IDENTIFIER> to an identifier macro so that <IDENTIFIER> behaves like a variable but is backed up by the location modeled by the locative.
And syntax
* (locative <IDENTIFIER>)
which takes an identifier bound to variable-like syntax (e.g. a variable) and returns a corresponding locative.
(Note that Michael Sperber's example from [1] does not work with `define-place' because a "place" (what is bound by `define-place') is not a first-class entity, but syntax.)
I have attached to this post a sample implementation and a test suite for this yet-to-be-written SRFI. The implementation is in R6RS Scheme (because it has record inspection and identifier syntax and R7RS large is not yet there), but the core parts are easily portable to R7RS-small.
--