2 ms·
By using a struct with lazily initialized members, for example.
by cornstalks 4y ago
By using a struct with lazily initialized members, for example.
- zabzonk 4y agoif that is your example, provide some code.
- cornstalks 4y agoPretend we have the following sum type: enum SumType { Foo(foo), Bar(bar), Baz(baz), } void DoSomething(SumType sum_type) { match sum_type { Foo(foo): foo.do_x(); Bar(bar): bar.do_y(); Baz(baz): baz.do_z(); } } This could be lowered to: struct LoweredSumType { optional<Foo> foo; optional<Bar> bar; optional<Baz> baz; } void DoSomething(LoweredSumType sum_type) { if (sum_type.foo.has_value()) { sum_type.foo->do_x(); } else if (sum_type.bar.has_value()) { sum_type.bar->do_y(); } else { sum_type.baz->do_z(); } } This isn't real code; it's a pretend language that's kind of a mix of Rust and C++. But it illustrates that the sum type can be lowered into a non-union representation.
- zabzonk 4y ago> Pretend we have the following sum type: which looks remarkably like a union to me, if i understand your made-up language.
- cdcarter 4y agoIt's not a union, though, it stores references to three memory locations, not just one (as a union represents a single memory location which can have multiple possible interpretations). And the lowered code has nothing protecting it from an invariant where more than one reference is non-null!
- the-smug-one 4y agoWhy does the members be lazily init:ed?
- cornstalks 4y agoIf the data types have constructors and/or destructors that have side effects then it has to be lazy. Otherwise IMO it's not really behaving like a sum type.