1. Си / Говнокод #24125

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    #include <stdio.h>
     
    int main(void) {
    	int i = 0;
    	loop:
    	i > 10 || printf("%d\n", i++) && goto loop;
    	printf("end\n");
    	return 0;
    }

    Зачем удолили #24105?

    Запостил: 3.14159265, 14 Апреля 2018

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

    • 3.14159265 ☓ насрал в #24105 (2018-04-13T21:55:51Z) #
      >Кстати, ты мне подкинул идею, что делть с локальными пиримеными и понтекстом — тупо забить, к хуям лок переменные, пусть все перменнйе будут глоьальными
      
      Exactly my point!
      
      Видимость и лоКАЛьные переменные для заедушных анскилябр и процедурно-функцианальных питухов.
      
      Лалка пиридаёт аргумент в функцию, когда можно по-царски просто мутировать глобальную переменную. Ретурны тоже не нужны.



      bormand ☓ насрал в #24105 (2018-04-13T22:11:14Z) #
      > ретурны не нужны
      В общем-то да. Но вот возможность брать адреса меток в этом случае не помешает.
      Иначе в конце каждой "функции" придётся знать все места, откуда её могли позвать.
      Ответить
      • Я имел ввиду что с глобальной видимостью не нужны ретурны значения из функции, и вообще абстракция функция исчезает как класс. А заодно не нужно городить кортежи и питухструктуры для возврата/педерачи нескольких значений из/в функции.
        Ответить
        • > функция исчезает как класс
          Ну как, иногда хочется общий кусок кода юзать из нескольких мест. Не копипастить же его каждый раз. Вот там понадобится указать этому куску куда надо вернуться.
          Ответить
          • В жопк глоб переменнве. Лучше юзать стек, а вместа функцый — слова.
            ФОРТ ФАРЕВА !!!
            Ответить
          • Ну так GOSUB / RETURN
            Но это же просто процедура, void. По сути GOTO c небольшим удобством: хранением адреса возврата на стеке.

            Классическое понимание функции как y=f(x) в данном случае убивается.

            Кстати, в том бейсике, на котором писал я, там вложенность была совсем мелкой, вот то ли 4 вызова, то ли 16.
            Ответить
            • Какой, блджад, стек? Если мы рассуждаем о парадигме меток и глобалок, то стек нинужен (его всегда можно запилить руками поверх массива, если он вдруг понадобится).

              Я предлагал взять адрес метки, на которую надо вернуться и просто положить его в глобалку. А общий кусок кода (не функция, не процедура, просто кусок!) возьмёт адрес из этой глобалки и прыгнет туда. Эдакий continuation passing style.
              Ответить
              • >Какой, блджад, стек?
                А куда GOSUB ложит адрес метку, с которой нужно продолжить выполнение?

                Ну тоже годно. Учитывая что стандартный стек сильно ограничен.

                > общий кусок кода (не функция!) просто возьмёт адрес из этой глобалки и прыгнет туда

                Причём я даже знаю как это лолжно быть реализовано.
                GOTO RETURN
                ....
                
                RETURN: IF SP=-1 THEN PRINT "RASPIDORASILO": END
                       SP=SP-1
                       GOTO STACK(SP+1)
                Ответить
                • Нет же. Стек при такой схеме не нужен.
                  sub1:
                      ...
                      goto *sub1_ret
                  
                  sub2:
                      ...
                      goto *sub2_ret
                  
                  main:
                      sub1_ret = &ret_from_sub1
                      goto sub1
                  ret_from_sub1:
                      sub2_ret = &ret_from_sub1
                      goto sub2
                  ret_from_sub2:
                      ...
                  Ответить
                  • Чёт не понимаю. Стек — обычный массив. SP — обычная переменная.
                    А здесь вместо массива предлагается sub1_ret, sub2_ret, sub100500_ret?


                    Как без этого делать вложенные вызовы?
                    А если я вызову из sub1 самого себя?
                    Так же техничнее:
                    MAIN:
                        SP=SP+1
                        STACK(SP) = ret_from_sub1
                        GOTO sub1
                    Ответить
                    • > если я вызову из sub1 самого себя
                      Таких функций мало. Они могут себе организовать хранение адресов возврата в массиве, связном списке или даже файле. Остальным на это похуй. Зачем всем подряд навязывать концепцию глобального стека?

                      З.Ы. Кто-то тут предлагал выйти из алкогольно-сишной парадигмы.
                      Ответить
                      • >Кто-то тут предлагал выйти из алкогольно-сишной парадигмы.

                        Да, в плане питушения со структурами, блоками кода в фигурных скобочках в т.ч. функциями.

                        А потом, как будто этого мало повыдумают замыкания, исключения, longjmp, мало что ещё. А так нет, локальных переменных — и замыкания уже есть.

                        >Зачем всем подряд навязывать концепцию глобального стека?
                        Так переменных нужно дохуя. И так абстракция получается кмк чище.
                        Ответить
                        • > и замыкания уже есть
                          Нет. Такое "замыкание" сломается как только ты еще раз вызовешь функцию, орудующую этим стекфреймом (например, чтобы сделать второе замыкание).
                          Ответить
                    • Ну или можно как на ARM'ах — завести одну глобалку под адрес возврата (ака регистр LR). И пусть каждая функция бекапит куда-нибудь (не обязательно на стек, т.к. восстанавливать будет только она сама) то, что в ней лежит перед тем, как положить новое значение и позвать перейти в другую функцию.
                      Ответить
                      • >Стек при такой схеме не нужен.

                        Просто хардкодный возврат не будет работать в случае полиморфных вызовов: хотим вызывать общий код, но заранее не знаем какой.
                        Делаем GOTO, но вычисляем адрес метки динамически.


                        >Ну или можно как на ARM'ах — завести одну глобалку под адрес возврата
                        Как вариант.
                        Ответить
                        • > глобалку под адрес возврата
                          Такое помоему ещё было у Кнута, в его MIX'е ( если не ошибаюссь )
                          Ответить
                        • > не знаем заранее какой
                          Да, это всё портит. Придётся всё-таки сводить к одной переменной на всех.
                          Ответить
                          • Не нужны ни переменные, ни стек:
                            пишем функцыи в виде сверхдлинннной упоротой строки, при выполнении вместа имен аргументов подставляются их значения, потом, под воздействием космических лучей, строка всячски мутирует, и в результате получаэса результат.

                            ЗЫ. Когда ещё не знал алгоритмы синтаксического разбора, пытавси нечто подобноэ сотворить. Невышло.
                            Ответить
    • Вот люди всё пытаются, мысля при этом в алгольно-сишной парадигме изобрести божественные фортран с бейсиком.

      Интересно, а почему б нечто подобное не сделать для функций? Ну например есть функция a() которая вызывает функцию b() которая вызывает функцию c(), которая вызывает функцию d(), и например в функции d() чтоб сделать особый return_3, который бы вернул управление на три уровня вниз, сразу в функцию a()? Хотя не, хуйня, надо ведь еще знать, какой там тип возвращается в функцию a() из функции b().
      http://govnokod.ru/23798

      И закономерно фейлят, потому живут в питузированном функцианальном мирке.
      Хочется творить божественные вещи, а абстракция ну... не сходится она вот никак, совсем.

      А в парадигме меток и глобальной видимости переменных всё работает на ура!
      Можно делать GOTO внутрь каких-то логических блоков кода, именуемых анскилябрами как "функции", при этом достаточно просто сделать комманду отмотки стека на N вызовов.
      Ответить
      • > вернул управление на три уровня вниз
        try/catch ???
        Ответить
        • Оверхед убивает царский код. Это же нужно раскручивать стек, пройти по каждому методу.
          Ответить
          • Яж говорю — нужно ФОРТ юзать:
            R> R> R> DROP DROP DROP EXIT
            Ответить
    • > Зачем удолили #24105?
      Его зачал один из любителей лолек маленьких мальчиков, видимо. Вот и попал под ковровую бомбардировку.
      Ответить
      • Его вобщет я зачал...

        Хотя я один раз пизданул про мальчиков...
        ...или два...
        x3
        Ответить

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