1. JavaScript / Говнокод #27772

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 28 Октября 2021

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

    • ну что .. высказываемся... а где же дампик... а не будет дампика.... а вот SEO пост будет.. (весь говнокод тут - https://github.com/ASDAlexander77/TypeScriptCompiler )
      Ответить
    • Структурная типизация практически, как в TS и должно быть.
      Ответить
      • а ниче что это нативная компиляция а не ECMAScript?
        Ответить
    • #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 звуковых карт, и чтобы там были какие-то общие интерфейсы... но это какая-то странная задача, нахуя это может быть нужно?
              Ответить
              • Ну может быть чтобы один код работал на разных версиях одной борды...Хотя там тоже проще заифдефать или файл с нужной реализацией выбрать.
                Ответить
      • и убери у себя "g" посмотрим как ты запоешь
        Ответить
        • Ну будет нолик в этом поле. А что надо?
          Ответить
          • А надо undefined?
            Ответить
            • потому что его "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.
      Ответить
    • Побойся бога! Абстрактные объекты не нужны.
      Ответить

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