I had a little problem with this feature — not only I’ve recently got a job and I have much less time for developing Skila, but I had no luck finding a source explaining how you usually implement generics in compiler. Nevertheless I started with the flavor which bugged me since C++, namely symbol generics.
Consider a pair for C++, taking regular approach you won’t make anything more than a structure with “first
” and “second
” fields. The code works of course, but the moment you pass such data you have to comment a lot of code, because “first
” carries absolutely zero information. Is this an address? Or salary? Or weight?
In C++ I was not completely lost — I wrote “NamedTuple
” macro and then I had regular fields as above plus reference fields with the names I passed. Thus I could pass named tuple to any template function which expected regular tuple (because I had “first
”, “second
”, and so on, fields). The downside was as usual with macros in C++ – they are harder to maintain.
I am not against introducing macros to Skila, but I’ll wait until they become necessity. And with symbol generics I can do more than I did in C++:
class Tuple<'ITEM1'> var _1 Int = 5; alias ITEM1 _1; end func main() Int do var m = new Tuple<'Id'>(); return m.Id; end
First of all, you deal with compiler, not preprocessor. Second — you don’t use references, but aliases, they don’t take space at all, so there is no penalty in taken memory. And third — it works. Here, you can see I instantiate the “Tuple
” class with symbol “Id
” and from that point I don’t use meaningless “_1
” but “Id
”. No need for extra comment stating “_1 holds Id”.
One of my idées fixes… fixed!