Boost logo

Boost :

From: Eric Niebler (eric_at_[hidden])
Date: 2004-06-06 11:12:37

Eric Niebler wrote:
> Eric Niebler wrote:
>> There is another solution. Give rules value semantics by default as I
>> suggest, but require people to use special syntax to get reference
>> semantics.
> I hate replying to myself. ;-) I realize this doesn't give true value
> semantics. A rule which refers to itself (that is, it indirectly stores
> a pointer to itself) cannot be copied around and put inside containers
> and whatnot. Then I thought that it could be solved with an extra layer
> of indirection -- shared_ptr to a shared_ptr (ugh!) but then you have
> problems with cyclic references. Hence Joel's comment about garbage
> collection -- he's probably been through this thought process before.
> I think I need to think it out again.

Here I go, replying to myself *again*. I've rethought this and come up
with a new scheme whereby rules (or in xpressive's case regexes) can
have both value *and* reference semantics. A good analogy would be a
pointer. You can copy pointers freely, creating aliases. You can
dereference the pointer and assign through it, changing all the aliases.
This is how regex objects in xpressive work right now (it's an experiment).

In addition, I have solved the cyclic/dangling reference problem. A
regex can refer to other regexes or itself and it tracks changes to its
referenced regexes. It lets you copy regex objects freely, even putting
them in containers, and they keep their references alive. It works with
nothing more sophisticated than shared_ptr and weak_ptr -- no garbage
collection is necessary. No cycles are created ever, so no cycles need
to be collected.

There are only two questions:
   (1) is the rule-as-pointer metaphor acceptable? and
   (2) can we find a palatable syntax?

The syntax issue is this: if we take assign to be shallow (creating
aliases) we need a different syntax for deep assign. I am using *= to
mean deep-assign. Perhaps there is a better solution.

Eric Niebler
Boost Consulting

Boost list run by bdawes at, gregod at, cpdaniel at, john at