Re: Код мінус соціум: у пошуках сенсів та форм
Догматичне мислення надто догматичне.
Саме в такому коді безумовний перехід має сенс. Тому що він насправді є неявно умовним: умовою є сама мова, за правилами якої обробляється код — залежно від неї, goto опиняється або в робочому коді, або в коментарі. Після чого з детекторної частини можна перейти до подальшої обробки, яку може бути зручніше винести кудись далі, оминувши чужий невалідний код, або ж гілки на різних мовах в якомусь місці об'єднуються:
rem=\
220
print("Bye!")
Або ще детектор кодових сторінок для cmd, побудований цілком на goto. В чому там особливість: я використав кириличні мітки. Якщо цей же код прочитати в іншому кодуванні, мітки зміняться. При цьому, cmd ототожнює мітки в різному регістрі (goto A дозволяє переходити на мітку a або A), нечутливість до регістру поширюється й на кирилицю та інші не-ascii-літери, але те, якому коду великої літери відповідає який код малої, залежить для них від поточної кодової сторінки. Ще одна особливість: cmd дозволяє дублювання міток — перехід здійснюється на найближчу після goto мітку з відповідним іменем. Таким чином, код
@goto І
....
:і
....
:І
....
здійснить перехід на першу мітку, якщо це те ж саме кодування, або на другу мітку, якщо в цьому кодуванні на місці кириличної літери І з'явився неалфавітний символ.
При бажанні, увесь цей код можна було б переписати, замінивши goto на call, але це не зробило б його менш макаронним.
Узагалі, в cmd варто ставитись до goto з належною повагою — там це законний засіб організації алгоритмів, повноцінної альтернативи якому немає. Структурованого циклу while нема — доводиться організовувати через goto. Команди for та if дозволяють писати структурований код, але вони поводяться як макрокоманди, що накладає певні обмеження (напр., проблематично отримати в тілі циклу поточне значення змінної, що в цьому ж циклі змінюється). Структурованих процедур нема — є команда call, що викликає або зовнішній файл, або мітку — у другому випадку, це щось подібне до gosub у традиційних діалектах BASIC'а — неструктурована підпрограма, за правильне місце завершення якої відповідає програміст. Ну і часто використовується ідіома goto :eof — завершення роботи пакетного файлу чи підпрограми.
З менш традиційних застосувань goto та міток: оскільки cmd толерантний до невалідного коду, за допомогою безумовного переходу вперед можна організувати багаторядковий коментар (аналог сішного /*...*/ ):
goto endcomment
Розлогий
багаторядковий
коментар
:endcomment
В тексті такого коментаря може бути будь-що, крім міток, на які можна перейти ззовні.
Цього взагалі не повинно бути ніде. Навіть в навчальному коді. Чи краще - "тим більше в навчальному коді". Навіть десь була ініціатива вилучити цей функціонал з подальших версій мови.
Якої саме мови?
В ряді сучасних мов goto нема початково — Python, наприклад, його не має. Чи робить це майбутніх програмістів розумнішими? ІМНО, це плодить програмістів, які не використовують goto, але не розуміють, що́ їхня програма робить насправді. Справді, в використанні goto здебільшого нема сенсу, але найпростіший спосіб пояснити, як працює структурований цикл і чим відрізняєься while від do...while — це розписати їх у вигляді коду з переходами на мітки. Можливо, в синтаксисі конкретної мови може не бути goto, або ця інструкція може потребувати додаткових параметрів компілятора, але сама концепція безумовного переходу в голові студента має десь відкластись. Розуміння goto і вміння організовувати алгоритмічні структури примітивними засобами може знадобитись, наприклад, при вивченні асемблера, де ніяких структурованих алгоритмічних блоків нема — тільки джампи, які є тими ж goto.