The "no gc" crowd
Dmitry Olshansky
dmitry.olsh at gmail.com
Fri Oct 11 08:12:59 PDT 2013
11-Oct-2013 18:46, Joseph Rushton Wakeling пишет:
> On 11/10/13 16:32, Dmitry Olshansky wrote:
>> This. And exactly the same for immutable. It's interesting how folks
>> totally
>> expect complex types (like containers) to meaningfully work with all 3
>> qualifiers.
>
> It's not so much that we expect it, as that we might expect that
> standard library types would _have the appropriate design work put in_
> so that they would "just work" with these qualifiers. (Admittedly
> shared is a bit of a special case right now that probably needs more
> work before support is rolled out.)
It can't - it's like expecting 37 to modify an become 76.
Simply put built-ins are special. Imagine a ref-counted type - how would
you copy it (and increment a count) with bit-wise immutability?
It simply doesn't make sense. (Yes, one can keep count elsewhere e.g. in
a global hash-table).
More importantly there is little incentive to make immutable stuff
ref-counted, especially COW-types. In this sense BigInt simply doesn't
work with immutable by design, if need be one can make FixedBigInt that
doesn't include COW, doesn't support read-modify-write and mixes well
with BigInt.
Immutable works best as static data and/or as snapshot style data
structures. It's tables, strings and some unique stuff that gets frozen
and published at a certain point (usually at start up).
It makes a lot less sense at local scope aside from aesthetic beauty as
there is plenty of invariants to check, and bitwise immutability is a
minority of that.
I would even suggest to adopt a convention for a pair of freeze/thaw
methods for any UDT that give you a deep copy of object this is made for
mutation (thaw on immutable object) or immutable (freeze mutable).
>
> If you tell me that's an unreasonable expectation then fair enough, but
> it feels pretty bad if e.g. library-implemented number types (big
> integers or floats, rationals, complex numbers, ...) can't from a user
> perspective behave exactly like their built-in counterparts.
No magic paint would automatically expel reference count from the
struct's body. With shared it's even more obvious.
In general user defined type has to be designed with one of 3 major use
cases in mind: local, immutable, shared.
--
Dmitry Olshansky
More information about the Digitalmars-d
mailing list