Chris Bitmead uid
Tue, 20 May 1997 09:46:53 +1000

>> >Can anyone think of any cases that it breaks?
>> Yes, the same situation that I already gave.
>Oh. Sorry!
>> The point is, when you have a persistent object store, you get at
>> objects using a reference to an object rather than a path name. Thus
>> you don't know where the object came from. Thus you can't make
>> assumptions about what should happen when you update it.
>That's why I'd refer to a container object, and then open it with a version
>ID; either a fixed functional reference or a "just give me the latest, dammit!"

Can you imagine how tedious this would be?

Imagine you normally implement map in Scheme as...

(defun map (proc . lists)
  (if (null? lists)
      (if (null? (car lists))
          (quote ())
          (cons (apply proc (apply first-lists lists))
                (apply map proc (apply rest-lists lists))))))

You can't do that anymore, you have to do...

(defun map (proc . lists)
  (if (null? lists)
      (if (null? (get-default-version-of (car lists)))
          (quote ())
          (cons (apply proc (get-default-version-of (apply first-lists lists)))
                (apply map proc 
                    (get-default-version-of (apply rest-lists lists)))))))

Except that it wouldn't work, because you might have a pointer to cons
cell v4 which points to cons cell v2 which points to cons cell v8,
none of which are the latest version. Therefore every object reference
in your system would have to have two components... a pointer to the
container object and a version id. Are you sure you want to go down
the road of having a language where every reference is made of two
parts, and isn't really a direct reference, but is an indirect
reference through some container object?