What I like about reference/dereference approach of C# is clean syntax — you work with data (struct
) and pointers to data (class
), yet in no place so far I made explicit mark that I have pointer or that I dereference a pointer. However the world of data in C# is so much divided that it takes an extra effort to write a method coping with structures and classes in generic way.
I would like to have in Skila more of C# model than C++, but not entirely — the level of control C++ provides is desirable. And each time I think of novel approach I come up with the same conclusion, so here we go…
The basic type definition would be “struct
” with the same meaning as in C++. The usage:
var a Foo = new Foo(); var b ^Foo = new ^Foo(); var c ^^Foo = new ^^Foo(); // and so on
“a
” would be an instance of type (struct
) “Foo
”, “b
” would be a pointer to “Foo
”, and “c
” would be a pointer to pointer to “Foo
”.
Skila would have “class
” keyword but unlike C# it would not mean a pointer to data, but pointer by default. You could be able to derive “class
” from “struct
” or vice versa, and of course you would be able to override default behaviour. Let’s assume “Bar
” was defined as “class
”:
var v *Bar = new *Bar(); var w Bar = new Bar(); var x ^Bar = new ^Bar(); // and so on
This is equivalent of Foo example — in the first line “v
” is data (because of dereference operator — “*
”). “w
” is a pointer to “Bar
” (default behaviour for class), and “x
” is a pointer to pointer to “Bar
”.
We need one final touch — automatic referencing and dereferencing. This means you can overload functions on types but not on reference depth (some price has to be paid). The advantage is you have to pay attention when implementing receiver (type declaration, a function) and on callee side you can rely on the simplest syntax. For example:
var b ^Foo = new Foo(); var v *Bar = new Bar();
But:
var b = new ^Foo(); var v = new *Bar();
And function declaration and call:
def CallMe(f ^^Foo) Void; CallMe(new Foo());
So far I didn’t see a language like this, so I hope overloading on reference depth won’t be deadly needed.