This page is part of the web mail archives of SRFI 17 from before July 7th, 2015. The new archives for SRFI 17 contain all messages, not just those from before July 7th, 2015.
David,
2 - After much grovelling over the formal semantics in R5RS, I can say
that bindings are *not* mutated by anything in that denotational
specification, locations are. However, denotational specifications
have the disadvantage that they over-specify the semantics of the
language in question and strongly suggest a particular
implementation. Hence R5RS has second-class locations in it's
formal spec, which I would like to see become first-class. A good
first-class location SRFI could be a testbed for an RnRS with the
feature.
There are several other things in a denotational semantics that are what
you would call "second class": environments, stores, etc. The Scheme syntax
has second-class citizens: parameter lists and let/rec/* definitions, which
cannot be the target of macro elaborations. I don't have time to explain
why this is the case and argue should stay so. Scheme is *not* about making
*everything* first-class.
For my dissertation (mid 80s), I developed a semantics, extending the plain
old lambda(value) calculus, that models call/cc, set-struct-field!, etc.
I teach it here, as early as in the freshman course. Here are the two
relevant samples:
------------------------------------------------------------------------
1. Interpreting set!
(define-struct sss (aaa bbb)) (define-struct sss (aaa bbb))
(define some-sss (make-sss 5 'hello)) ==> (define some-sss (make-sss 5 'hello))
(define a-variable a-value) (define a-variable another-value)
... ...
E[(set! a-variable another-value)] E[(void)]
------------------------------------------------------------------------
2. Interpreting set-struct-field!
(define-struct sss (aaa bbb)) (define-struct sss (aaa bbb))
(define some-sss (make-sss 5 'hello)) ==> (define some-sss (make-sss 5 'world))
(define a-variable a-value) (define a-variable a-value)
... ...
E[(set-sss-bbb! some-sss 'world)] E[(void)]
------------------------------------------------------------------------
[DrScheme's stepper will explain the behavior of programs with such
transformation rules.]
The rules show what we mean when we say "set! modifies variable-value
bindings" and "set-struct-field! modifes the value but not the binding.
The value before and after the set-struct-field! are eq? and we can even
write this eq? procedure:
(define (eq-sss? a b)
(let* ([a-aaa (sss-aaa a)]
[b-aaa (sss-aaa b)]
[_ (set-sss-aaa! a 0)]
[_ (set-sss-aaa! b 1)]
[result (= (sss-aaa a) (sss-aaa b))]
[_ (set-sss-aaa! a a-aaa)]
[_ (set-sss-aaa! b b-aaa)])
result))
-- Matthias