Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

you cant reuse names with top line functions:

    package hello
    
    type cat int
    
    func greet(c cat) cat {
       return c + 1
    }
    
    type dog string
    
    func greet(d dog) dog { // greet redeclared in this block
       return d + "one"
    }
but you can with methods:

    package hello
    
    type cat int
    
    func (c cat) greet() cat {
       return c + 1
    }
    
    type dog string
    
    func (d dog) greet() dog {
       return d + "one"
    }


I don’t think that’s a strong argument. It’s just function overloading that some languages enable, others don’t. Not a categorical difference.


OK please show me the equivalent code in C then


It's possible with _Generic but there's a lot of caveats. Any seasoned C dev would just have two functions with a prefix or suffix, like cat_greet() and dog_greet().

But if you insist, it would look something like:

    typedef ... cat;
    typedef ... dog;

    void cat_greet(cat *obj) {/*do stuff */}

    void dog_greet(dog *obj) {/*do stuff */}

    #define greet(X) _Generic((X), cat: cat_greet, dog: dog_greet)(X)

    int main(...) 
    {
         cat mycat;
         dog mydog;
         greet(&mycat);
         greet(&mydog);
         return 0;
    }


that is really, really ugly. using methods, I dont have to mess with function prefixes, and I dont have to pollute the global scope.


Again that's this language constraining you to that. With procedure overloading it's not required that you have to have that ugly API. For instance the following is valid Nim:

  type
    Cat = object # these are just 'struct' in a different skin
    Dog = object

  proc greet(c: Cat): string = "Meow"
  proc greet(d: Dog): string = "Bark"

  assert Dog().greet() == "Bark"
  assert Cat().greet() == "Meow"




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: