record single inheritance, partial solution to record problem
The record system reminded me of the situation in assembly language. Could "single inheritance of records" allow some shared field names as a stopgap solution without breaking much of the existing language and source, or precluding future solutions to this issue;
Under this proposal, accessor functions in the same namespace would always access the same slot.
imagine a keyword 'extends' in a data constructor that creates any boilerplate behind the scenes.
data Base = Base { slotA::Int32, slotB::Int32 }
data Foo = Foo extends Base { foo :: Int32 }
data Bar = Bar extends Base { bar1 :: Float,bar2 ::Float }
'slotA' is now always a function to extract the first element of a 2,3,4 element tuple 'slotB' is now always a function to extract the second element of a 2,3,4 element tuple 'foo' is a functions to extract the 3rd slot. 'bar1','bar2' are functions to extract the 3rd,4th slots by analogy with c++,
struct Base {
int32 slotA,int32 slotB;
}; 'a' now corresponds to an memory offset of 0
'b' now corresponds to an memory offset of 4
struct Foo : public Base
{
int32 foo;
};
'foo' now corresponds to a memory offset of 8
struct Bar : public Base
{
float bar1;
float bar2;
};
// 'bar1' now corresponds to a memory offset of 8
// 'bar2' now corresponds to a memory offset of 12
// 'a' corresponds to a ptr offset of 0, for all types
// 'b' corresponds to a ptr offset of 4 for all types
By analogy to assembly-language:-
; declare 'Base' datsstructure elements
RSRESET ;clear structure offset counter
slotA RW 1 ; reserve 1 word for 'slotA'
slotB RW 1
baseSize RW 0
; declare 'Foo' datastructure elements
RSSET baseSize ; 'Foo' extends 'Base', set counter to end of 'Base'
foo RW 1
fooSize RW 0
; declare 'Bar' datastructure members
RSSET baseSize ; 'Bar' extends 'Base'
bar1 RW 1
bar2 RW 1
barSize RW 0
;result:- (4byte words)
;slotA=0, slotB=4, foo=8, bar1=8, bar2=12
; baseSize=0; fooSize=12; barSize=16