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

    Комментарии (43) 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'е ( если не ошибаюссь )
                          Ответить
                        • > не знаем заранее какой
                          Да, это всё портит. Придётся всё-таки сводить к одной переменной на всех.
                          Ответить
                          • Не нужны ни переменные, ни стек:
                            пишем функцыи в виде сверхдлинннной упоротой строки, при выполнении вместа имен аргументов подставляются их значения, потом, под воздействием космических лучей, строка всячски мутирует, и в результате получаэса результат.

                            ЗЫ. Когда ещё не знал алгоритмы синтаксического разбора, пытавси нечто подобноэ сотворить. Невышло.
                            Ответить
                            • > Когда ещё не знал алгоритмы синтаксического разбора
                              - а щас знаешь?
                              Ответить
                              • Рекурсивного спуска знаю, остальные только читал.

                                Там всякие Ахо, Карасики, Эйзенхауэры, магазины автоматов и пр.
                                Ответить
                                • Ахо, Карасики, это разве не поиск строки в подстроке?

                                  "магазины автоматов " это вроде такой зверь между машиной туринга и конченным автоматом для одного из вида горматик хамски, не?


                                  зы: если что -- я ламер, и могу вообще не в тему ляпнуть
                                  Ответить
                                  • Да я перепутал, видимо у меня в голове засела ассоциация Ахо с парсингом, он же один из авторов дракоши, вместе с Сати и Ульяном.

                                    Магазины автомата разбирают любую котекстно-свободную громматику жи. Кстати, алгоритм рекурсивного пуска это фактически та же хуйня, только стек состояний неявный в виде лакалок в функциях и стека разврата.
                                    Ответить
                                • Ахо – Корасик это же поиск подстроки. Или что ты имел в виду под синтаксическим разбором тогда?

                                  Парсеры-лексеры, кстати, сам пишешь? Только для форта или чо посложнее?
                                  Ответить
                                  • если я сделал лексер на JFlex, то это сичтается, или нет?
                                    Ответить
                                  • Я года 3-4 назад любил писнуть какого нибудь небольшого конпелятора или интерпретатора. Возможно поэтому мнге потом так полюбился фрот.

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

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

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

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

      А в парадигме меток и глобальной видимости переменных всё работает на ура!
      Можно делать GOTO внутрь каких-то логических блоков кода, именуемых анскилябрами как "функции", при этом достаточно просто сделать комманду отмотки стека на N вызовов.
      Ответить
    • > Зачем удолили #24105?
      Его зачал один из любителей лолек маленьких мальчиков, видимо. Вот и попал под ковровую бомбардировку.
      Ответить
      • Его вобщет я зачал...

        Хотя я один раз пизданул про мальчиков...
        ...или два...
        x3
        Ответить
    • Ничего не понимаю. Переведи на «PHP».
      Ответить
      • В «PHP» goto не возвращает значения, а printf возвращает единицу. Поэтому так:
        <?php
         
        $i = 0;
        loop:
        if($i > 10 || 0 * printf("%d\n", $i++)) ; else goto loop;
        printf("end\n");
        return 0;


        https://ideone.com/pwKyZL
        Ответить
        • Так и в си goto ничего не возвращает.
          Ответить
          • как вы себе представляете возращаемое значение гоуту? Как fork?
            Ответить
          • А точно, в «Си» не компилируется. Пи — трололо.
            Ответить
            • А точно, в «Пи» не компилируется. Три — силоло.
              Ответить
            • Это не пи, он просто хотел продолжить обсуждение из удалённого треда.

              Этот код нашёл я, в recent posts на ideone.
              Ответить
              • Кстати, код напоминает типичный код на «bash». Или даже «Icon» с его цепочкой сравнений.
                Ответить

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