- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
#include <stdio.h>
int main(void) {
int i = 0;
loop:
i > 10 || printf("%d\n", i++) && goto loop;
printf("end\n");
return 0;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
#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.04.2018 15:31 # 0
3.14159265 14.04.2018 15:33 # 0
bormand 14.04.2018 15:41 # 0
Ну как, иногда хочется общий кусок кода юзать из нескольких мест. Не копипастить же его каждый раз. Вот там понадобится указать этому куску куда надо вернуться.
I_AM_SHIT 14.04.2018 15:43 # 0
ФОРТ ФАРЕВА !!!
shit_again 21.05.2018 08:08 # 0
3.14159265 14.04.2018 15:46 # 0
Но это же просто процедура, void. По сути GOTO c небольшим удобством: хранением адреса возврата на стеке.
Классическое понимание функции как y=f(x) в данном случае убивается.
Кстати, в том бейсике, на котором писал я, там вложенность была совсем мелкой, вот то ли 4 вызова, то ли 16.
bormand 14.04.2018 15:50 # 0
Я предлагал взять адрес метки, на которую надо вернуться и просто положить его в глобалку. А общий кусок кода (не функция, не процедура, просто кусок!) возьмёт адрес из этой глобалки и прыгнет туда. Эдакий continuation passing style.
3.14159265 14.04.2018 15:53 # 0
А куда GOSUB ложит адрес метку, с которой нужно продолжить выполнение?
Ну тоже годно. Учитывая что стандартный стек сильно ограничен.
> общий кусок кода (не функция!) просто возьмёт адрес из этой глобалки и прыгнет туда
Причём я даже знаю как это лолжно быть реализовано.
bormand 14.04.2018 16:05 # +1
3.14159265 14.04.2018 16:14 # 0
А здесь вместо массива предлагается sub1_ret, sub2_ret, sub100500_ret?
Как без этого делать вложенные вызовы?
А если я вызову из sub1 самого себя?
Так же техничнее:
bormand 14.04.2018 16:24 # 0
Таких функций мало. Они могут себе организовать хранение адресов возврата в массиве, связном списке или даже файле. Остальным на это похуй. Зачем всем подряд навязывать концепцию глобального стека?
З.Ы. Кто-то тут предлагал выйти из алкогольно-сишной парадигмы.
3.14159265 14.04.2018 16:50 # 0
Да, в плане питушения со структурами, блоками кода в фигурных скобочках в т.ч. функциями.
А потом, как будто этого мало повыдумают замыкания, исключения, longjmp, мало что ещё. А так нет, локальных переменных — и замыкания уже есть.
>Зачем всем подряд навязывать концепцию глобального стека?
Так переменных нужно дохуя. И так абстракция получается кмк чище.
subaru 15.04.2018 18:10 # −1
Нет. Такое "замыкание" сломается как только ты еще раз вызовешь функцию, орудующую этим стекфреймом (например, чтобы сделать второе замыкание).
Perevedi_na_PHP 06.10.2018 21:58 # 0
bormand 14.04.2018 16:44 # 0
3.14159265 14.04.2018 18:30 # +1
Просто хардкодный возврат не будет работать в случае полиморфных вызовов: хотим вызывать общий код, но заранее не знаем какой.
Делаем GOTO, но вычисляем адрес метки динамически.
>Ну или можно как на ARM'ах — завести одну глобалку под адрес возврата
Как вариант.
I_AM_SHIT 14.04.2018 18:33 # 0
Такое помоему ещё было у Кнута, в его MIX'е ( если не ошибаюссь )
bormand 14.04.2018 23:56 # 0
Да, это всё портит. Придётся всё-таки сводить к одной переменной на всех.
I_AM_SHIT 15.04.2018 19:51 # +1
пишем функцыи в виде сверхдлинннной упоротой строки, при выполнении вместа имен аргументов подставляются их значения, потом, под воздействием космических лучей, строка всячски мутирует, и в результате получаэса результат.
ЗЫ. Когда ещё не знал алгоритмы синтаксического разбора, пытавси нечто подобноэ сотворить. Невышло.
Desktop 07.02.2020 23:06 # 0
- а щас знаешь?
KpunoBblu_nemyx 07.02.2020 23:14 # 0
Там всякие Ахо, Карасики, Эйзенхауэры, магазины автоматов и пр.
guest8 07.02.2020 23:17 # −999
KpunoBblu_nemyx 08.02.2020 00:48 # 0
Магазины автомата разбирают любую котекстно-свободную громматику жи. Кстати, алгоритм рекурсивного пуска это фактически та же хуйня, только стек состояний неявный в виде лакалок в функциях и стека разврата.
Desktop 07.02.2020 23:18 # 0
Парсеры-лексеры, кстати, сам пишешь? Только для форта или чо посложнее?
guest8 07.02.2020 23:20 # −999
KpunoBblu_nemyx 08.02.2020 00:55 # +1
Обычно сам, на всяких флексах и бизонах только калькульца ради интереса пробовал.
Сейчас только что нибудь небольшое в форте по фану могу наговнякать.
3.14159265 14.04.2018 15:39 # 0
Интересно, а почему б нечто подобное не сделать для функций? Ну например есть функция a() которая вызывает функцию b() которая вызывает функцию c(), которая вызывает функцию d(), и например в функции d() чтоб сделать особый return_3, который бы вернул управление на три уровня вниз, сразу в функцию a()? Хотя не, хуйня, надо ведь еще знать, какой там тип возвращается в функцию a() из функции b().
http://govnokod.ru/23798
И закономерно фейлят, потому живут в питузированном функцианальном мирке.
Хочется творить божественные вещи, а абстракция ну... не сходится она вот никак, совсем.
А в парадигме меток и глобальной видимости переменных всё работает на ура!
Можно делать GOTO внутрь каких-то логических блоков кода, именуемых анскилябрами как "функции", при этом достаточно просто сделать комманду отмотки стека на N вызовов.
I_AM_SHIT 14.04.2018 15:45 # 0
try/catch ???
3.14159265 14.04.2018 15:48 # 0
I_AM_SHIT 14.04.2018 15:50 # +2
R> R> R> DROP DROP DROP EXIT
Perevedi_na_PHP 06.10.2018 21:59 # 0
KpunoBblu_nemyx 07.02.2020 21:34 # 0
bormand 14.04.2018 15:40 # 0
Его зачал один из любителей лолек маленьких мальчиков, видимо. Вот и попал под ковровую бомбардировку.
I_AM_SHIT 14.04.2018 15:48 # 0
Хотя я один раз пизданул про мальчиков...
...или два...
x3
bagrinho 07.02.2020 20:45 # 0
HoBorogHuu_nemyx 07.02.2020 21:08 # 0
https://ideone.com/pwKyZL
KpunoBblu_nemyx 07.02.2020 21:32 # +1
guest8 07.02.2020 23:09 # −999
HoBorogHuu_nemyx 08.02.2020 00:44 # 0
guest8 08.02.2020 00:47 # −999
Desktop 08.02.2020 00:49 # 0
KpunoBblu_nemyx 08.02.2020 00:58 # 0
Этот код нашёл я, в recent posts на ideone.
HoBorogHuu_nemyx 08.02.2020 01:14 # 0