[HN Gopher] The Gamma Language
       ___________________________________________________________________
        
       The Gamma Language
        
       Author : RossBencina
       Score  : 30 points
       Date   : 2025-12-06 08:42 UTC (3 days ago)
        
 (HTM) web link (lair.masot.net)
 (TXT) w3m dump (lair.masot.net)
        
       | masot wrote:
       | Playing with 'minimal' ways to add templates/generics/reflection
       | to C has become a bit of a dumb hobby of mine (in this case
       | shared/enabled by Akshay!).
       | 
       | Gamma was an experiment in templates without having to parse C.
       | This led to some big annoyances that I guess aren't mentioned on
       | that site but are in the PagedOut page[1]: when you instantiate a
       | template "bar::[struct foo]" Gamma does a pretty bad job of
       | knowing to copy the definition of "struct foo" (and all type
       | definitions that "struct foo" depends on) from the caller into
       | the template before compiling the instantiated template. (It gets
       | even worse with circular dependencies, e.g., a "struct tree_node"
       | that contains a "list::[struct tree_node]".)
       | 
       | More recently I've been writing MaC[2], which solves those
       | problems by fully parsing the "header file" for each template. So
       | it knows about all of the types in the program and can copy them
       | between template instantiations as needed, but in the "main body"
       | of the template you can use arbitrary GNU-C features. This has
       | been a lot more reliable. As a test program for it I'm currently
       | in the middle of writing an LR[k] parser generator[3] in MaC.
       | 
       | The big thing that gets annoying about all of these "don't-parse-
       | the-code" approaches is there's no good way to do type inference.
       | So you can't do multiple dispatch, e.g., have
       | "print(x->foo(bar));" forwarded to the 'right' print function
       | based on the type of its argument. (Actually, I've experimented
       | with doing dynamic dispatch based on DWARF information, but
       | that's a huge can of worms itself!)
       | 
       | [1] https://pagedout.institute/download/PagedOut_007.pdf#page=44
       | [2] https://lair.masot.net/mac/ [3]
       | https://lair.masot.net/git/mac.git/tree/examples/lrk (sorry about
       | the unreadable color scheme, still tuning it ...)
        
       | sfpotter wrote:
       | What's the use case for a language like this?
       | 
       | I used to very down on C++ but have stopped caring _quite_ so
       | much... Just using C++ and restricting oneself to templates seems
       | like a better bet than this. Or you could use D and have a
       | language whose template experience is much better than C++ 's...
       | 
       | Any language this is going to need debug info eventually. One
       | could step through the generated C code, but this is much less
       | pleasant than stepping through the original source.
       | 
       | I also wonder how name mangling is handled?
        
         | masot wrote:
         | For me, it was just to have some fun seeing whether you can get
         | the convenience of generics in C without blowing up the size of
         | a "minimal standards-compliant compiler." E.g., Chibicc[1] is
         | only a few thousand lines of code; adding Gamma to that would
         | not blow it up by much. There's something aesthetically
         | pleasing about knowing I can read the whole thing in a few
         | days. Nothing like that is possible for C++ (or D?) AFAIK.
         | 
         | But yes --- for a real project I would absolutely recommend
         | someone use D over this !
         | 
         | [1] https://github.com/rui314/chibicc
        
           | sfpotter wrote:
           | Totally fair. Just wondering if there was some specific
           | motivation for being able to do this... "For fun" is valid,
           | IMO. ;-)
        
       | wosined wrote:
       | Why is the Type T notation needed. Just make T the generic type
       | by default and allow using it instead of int, float etc. Is that
       | not possible? This looks like a lot of syntactic noise. Not as
       | bad a c++, but not far from it.
        
         | wosined wrote:
         | If you need more than just T, then you could do T1, T2, ..., Tn
         | as well.
        
       ___________________________________________________________________
       (page generated 2025-12-09 23:01 UTC)