ЙажаСценарий / Говнокод #27772 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
interface Something {
    r: number;
    g: number;
    b: number;
    toString: () => string;
}

function main() {
    const something = {
        r: 11.0, g: 12.0, b: 13.0, toString() {
            return "Hello " + this.b;
        }
    };

    const iface = <Something>something;
    print(iface.toString());

    print("done.");
}

Интерфесы для абстрактых обьектов.. а ваш говно компилятор может так?

Запостил: ASD_77 ASD_77, (Updated )

Комментарии (24) RSS

  • Структурная типизация практически, как в TS и должно быть.
    Ответить
  • #include <stdio.h>
    #include <stdlib.h>
    
    #define F(a, b) typeof( a (*) b )
    
    struct something
    {
      float r;
      float g;
      float b;
      F(char *, (void *)) toString;
    };
    
    char *shit(void *this)
    {
      struct something *tmp = this;
      char *str = malloc(100); // должно хватить!
      if (!str) return "malloc error))) kakoi bagor )))";
      snprintf(str, 100, "Hello %f", tmp->b);
      return str;
    }
    
    int main(void)
    {
      struct something smth = 
      {
        .r = 11.0, .g = 12.0, .b = 13.0, .toString = shit
      };
      fputs(smth.toString((void *)&smth), stdout);
      return 0;
    }
    Ответить
    • на контролере ты не можешь позволить себе такое расточительство char *str = malloc(100); // должно хватить!
      Ответить
      • В контроллерах мне нахрен не нужны никакие "интерфесы для абстрактых обьектов"
        Ответить
        • Ну все равно же есть какие-то интерфейсы для драйверов? Или все устройства всегда известны?
          Ответить
          • Обычно все "устройства" уже впаяны, и втыкаться туда разве что SD-карта может. Хотя есть конечно всякие STM32 с USB OTG и можно себе теоретически представить такую хуйню, что вот чтобы туда можно было втыкать например кучу вореантов каких-нибудь USB звуковых карт, и чтобы там были какие-то общие интерфейсы... но это какая-то странная задача, нахуя это может быть нужно?
            Ответить
            • Ну может быть чтобы один код работал на разных версиях одной борды...Хотя там тоже проще заифдефать или файл с нужной реализацией выбрать.
              Ответить
          • потому что его "something" работает с одной структурой.. а мой с любой.

            interface Something {
                r: number;
                g: number;
                b: number;
                toString: () => string;
            }
            
            function main() {
                const something = {
                    r: 11.0, g: 12.0, b: 13.0, toString() {
                        return "Hello " + this.b;
                    }
                };
            
                const something2 = {
                    r: 11.0, g: 12.0, extra:111.0, b: 13.0, toString() {
                        return "Hello " + this.b;
                    }
                };
            
                let iface = <Something>something;
                print(iface.toString());
            
                iface = <Something>something2;
                print(iface.toString());
            
                print("done.");
            }
            Ответить
            • toString() в something и something2 это две разные функции? Или это может быть одна функция, которой каким-то образом передается то, какая там структура?

              Если это две разные функции, можно просто написать две разные структуры и две разные функции, и никаких проблем.
              Ответить
              • У ASD_77 функции разные. Они же явно описаны как замыкания, захватывающие this.b.
                Ответить
                • У меня в контроллерах может не быть места чтобы кучу разных функций делать, и я могу захотеть чтоб была одна единственная функция, которая б принимала некую инфу о том, что за хуета в структуру напихана, и что-то с ней на основе этого делала. В тупоскрипте так можно?
                  Ответить
                  • Теоретически если Something не чистый интерфейс, а класс, позволяющий написать реализацию метода toString, можно обойтись и одной функцией. Тогда у something и something2 эту функцию не описываем.

                    Можно ли так в тупоскрипте, не знаю.
                    Ответить
              • тк. Something это интерфейс то toString может быть любой. но не любой для something & something2
                Ответить
            • Ну и рассмотрим такую хрень
              let iface = <Something>something;
              print(iface.toString());
              
              var someshit = Math.floor((Math.random() * 100));
              if(someshit == 0) {
                  iface = <Something>something2;
              }
              print(iface.toString());


              Вот тут может вызваться iface.toString() из something или something2 верно? Значит, в iface должна быть некая информация о том, какая там структура вхуячена, а это уже анскильное говно как по мне. Но это конечно можно разрулить тем или иным способом, например через крестопарашный "std::variant" или через union с какой-то хуйней, которая б указывала на то, интерпретируем мы это говно как такую или как такую говноструктуру, и на основе этого вызывается то или иное говно
              Ответить
              • Интересно, как реализовано iface = <Something>something2.

                Мне кажется, это можно сделать без RTTI. На этапе компиляции известно, какое поле в какое копировать. Компилятор рассчитает смещения. Указатель на функцию можно хранить как указатель на виртуальный метод.
                Ответить
                • тут не RTTI. тут простой мапинг. т.к. Interface - это структура которая хранит ссылки на поля и методы. но т.к. структура одна и таже то можно впихнуть любой мапинг на любой обьект. в этом и есть смысл интерфесов .. .что абстрактый обьект но интерфейс — это предопределенный контракт
                  Ответить
              • это не анскильность . а крутость.. писать одну функцию для двух разных объектах но которые может быть обработанны через интерфейс. Это называется "open-close" принципал 🙂
                Ответить
  • Поэтому я за
    Record Shit := shit { r : nat; g : nat; b : nat; toString : True -> string }.
    Section shit.
      Context `{Shit}.
      ..
    End shit.
    Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8