- 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?
Ну как, иногда хочется общий кусок кода юзать из нескольких мест. Не копипастить же его каждый раз. Вот там понадобится указать этому куску куда надо вернуться.
ФОРТ ФАРЕВА !!!
Но это же просто процедура, void. По сути GOTO c небольшим удобством: хранением адреса возврата на стеке.
Классическое понимание функции как y=f(x) в данном случае убивается.
Кстати, в том бейсике, на котором писал я, там вложенность была совсем мелкой, вот то ли 4 вызова, то ли 16.
Я предлагал взять адрес метки, на которую надо вернуться и просто положить его в глобалку. А общий кусок кода (не функция, не процедура, просто кусок!) возьмёт адрес из этой глобалки и прыгнет туда. Эдакий continuation passing style.
А куда GOSUB ложит адрес метку, с которой нужно продолжить выполнение?
Ну тоже годно. Учитывая что стандартный стек сильно ограничен.
> общий кусок кода (не функция!) просто возьмёт адрес из этой глобалки и прыгнет туда
Причём я даже знаю как это лолжно быть реализовано.
А здесь вместо массива предлагается sub1_ret, sub2_ret, sub100500_ret?
Как без этого делать вложенные вызовы?
А если я вызову из sub1 самого себя?
Так же техничнее:
Таких функций мало. Они могут себе организовать хранение адресов возврата в массиве, связном списке или даже файле. Остальным на это похуй. Зачем всем подряд навязывать концепцию глобального стека?
З.Ы. Кто-то тут предлагал выйти из алкогольно-сишной парадигмы.
Да, в плане питушения со структурами, блоками кода в фигурных скобочках в т.ч. функциями.
А потом, как будто этого мало повыдумают замыкания, исключения, longjmp, мало что ещё. А так нет, локальных переменных — и замыкания уже есть.
>Зачем всем подряд навязывать концепцию глобального стека?
Так переменных нужно дохуя. И так абстракция получается кмк чище.
Нет. Такое "замыкание" сломается как только ты еще раз вызовешь функцию, орудующую этим стекфреймом (например, чтобы сделать второе замыкание).
Просто хардкодный возврат не будет работать в случае полиморфных вызовов: хотим вызывать общий код, но заранее не знаем какой.
Делаем 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
Его зачал один из любителей лолек маленьких мальчиков, видимо. Вот и попал под ковровую бомбардировку.
Хотя я один раз пизданул про мальчиков...
...или два...
x3
https://ideone.com/pwKyZL
Этот код нашёл я, в recent posts на ideone.