# [plt-scheme] boxes?

On 1/23/07, gregory.woodhouse at sbcglobal.net
<gregory.woodhouse at sbcglobal.net> wrote:
>* The genesis of my original question was a combination of a misreading of a manual, and the observation that numbers and pairs just don't behave the same way:
*>*
*>* > (define (test1 x)
*>* (set! x 4))
*>* > (define x 1)
*>* > (test1 x)
*>* > x
*>* 1
*>* > (define (test2 x)
*>* (set-car! x 4))
*>* > (define x '(1 1))
*>* > (test2 x)
*>* > x
*>* (4 1)
*
The problem here is not that numbers and lists work differently, but
that lists and *variables* work differently. The (set! ...) form
works on variables, not values; the set-car! form works on values. It
would be possible to implement integers that had a "set-integer!"
procedure, so you could modify an integer as it was passed around, but
that's not the same as set!.
Boxes, like variables, contain a mutable reference to a single value,
but unlike variables they are values that can be passed around, not
names bound in a lexical scope. So the function test1 above could be
written as:
>* (define (test1-boxed b)
* (set-box! b 4))
>* (define v (box 1))
*>* (test1-boxed v)
*>* (unbox v)
*4
Some languages, like SML, clear up the variable/value distinction by
allowing mutable values (boxes, records or vectors with mutable
fields, etc.) but disallowing mutable variables. Without set!,
perhaps the value-mutation procedures aren't as confusing.
--
Carl Eastlund