глупый программистский вопрос
Apr. 12th, 2003 03:04 pm(только программистам интересно, наверное)
Почему в процедуральных языках, как правило, нет оператора досрочного выхода из блока? Как break в C, но чтобы работал не только из циклов, а также внутри if-then или вообще любого блока.
Постоянно приходится делать глупые вложенные цепочки условий или некрасивые трюки типа while(1) и выполза по break'у (ну или, понятно, их аналоги в других языках).
Есть какая-то глубокая причина этому?
Почему в процедуральных языках, как правило, нет оператора досрочного выхода из блока? Как break в C, но чтобы работал не только из циклов, а также внутри if-then или вообще любого блока.
Постоянно приходится делать глупые вложенные цепочки условий или некрасивые трюки типа while(1) и выполза по break'у (ну или, понятно, их аналоги в других языках).
Есть какая-то глубокая причина этому?
no subject
Date: 2003-04-12 05:20 am (UTC)Кстати, в VBScript (и VB.NET) есть операторы выхода из цикла Exit For и Exit Do, а также сложные ветвления типа If ... ElseIf ... ElseIf ... Else
А вообще какие-нибудь профессора скажут наверняка, что подобную функциональность надо выносить в функции, из которых можно выскочить по return(что-то). Иначе в начале блока, следующего за тем, из которого можно выпрыгнуть, придется проверять, как именно мы из этого предыдущего блока вышли и что можно предполагать относительно измененных внутри него переменных.
no subject
Date: 2003-04-12 05:28 am (UTC)Теория структурного программирования плюс структурно-функциональный дизайн (Йордон) плюс практика алгольного семейства языков.
no subject
Ещё в C нужен способ определить cleanup (напр. определить, что ресурс, запрошенный в начале функции или блока должен быть освобожден при любом выходе из нее/него), и способ определить структуру состоящую из заголовка за которым следует часть, которая повторяется неизвестное при компиляции число раз вроде
где для namеtable выделяется место для заголовка и массива names из 100 элементовno subject
Date: 2003-04-12 06:15 am (UTC)Я думаю, что это тяжелое наследие Паскаля, в котором, как мне помнится, нет выхода из цикла по BREAK.
no subject
Date: 2003-04-12 06:17 am (UTC)no subject
Date: 2003-04-12 06:24 am (UTC)http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#6842
no subject
Date: 2003-04-12 06:28 am (UTC)label:
if(condition)
{
...
if(another) break label;
...
}
Не в чем проверить, работает это или нет.
no subject
Date: 2003-04-12 06:29 am (UTC)Это "скрытый" оператор перехода. В некоторых из тех языков, в которых он есть (и даже есть полноценный оператор перехода), эти идеологические уступки стараются не афишировать :)
Если память мне не изменяет, то в фирменном учебнике по борландовскому паскалю примеры с операторами перехода отсутствовали (что не мешало существовать им самим в борландовской версии паскаля - или путаю?).
no subject
Date: 2003-04-12 06:35 am (UTC)no subject
Date: 2003-04-12 06:37 am (UTC)no subject
Date: 2003-04-12 06:52 am (UTC)Сколько хороших вещей можно сделать с CPS-ным кодом, о боже мой.
Re:
Date: 2003-04-12 07:24 am (UTC)В C, по-моему, нет cleanup'а по двум причинам, в чём-то друг от друга зависящим: во-первых, железо начала 70-х (речь идёт не о мейнфреймах, конечно) его плохо поддерживало; во-вторых, C изначально был задуман как язык, в котором все переходы контроля абсолютно прозрачны для программиста. В C никогда ничего не происходит "за кулисами" с точки зрения выполнения каких-то команд. Именно поэтому сторонники других языков любят называть C макроассемблером, но, с другой стороны, это идеально подходит для системного кода, для realtime-кода, и вообще во всех случаях, когда программист должен более или менее чётко представлять, что происходит во время исполнения вот этой конкретной строки кода.
Структура динамического размера - да, было бы удобно, хотя это syntactic sugar, по сути дела.
no subject
Date: 2003-04-12 07:29 am (UTC)В Oberon тоже есть.
В GNU Pascal тоже есть.
Нету только в виртовском.
no subject
Date: 2003-04-12 07:30 am (UTC)Оба можно назвать "скрытыми операторами перехода" в одинаковой мере. Если есть первый, почему бы "за ту же цену" не предоставить второй?
Re:
Date: 2003-04-12 07:32 am (UTC)no subject
no subject
Date: 2003-04-12 07:39 am (UTC)no subject
Date: 2003-04-12 07:52 am (UTC)no subject
no subject
Date: 2003-04-12 08:05 am (UTC)no subject
no subject
Date: 2003-04-12 08:47 am (UTC)Правда я не знаю, сколько "правильных" программистов позволяют себе им пользоваться вне switch, а тем более с дополнительным аргументом :)
no subject
Date: 2003-04-12 08:55 am (UTC)no subject
Date: 2003-04-12 08:55 am (UTC)Re:
Date: 2003-04-12 08:59 am (UTC)Ситуация: тебе нужно сделать одну проверку; если она проходит, вторую; если эта проходит, третью, и если третья проходит, выполнить некую нетривиальную последовательность действий. Возможность проведения каждой провеки зависит от успеха предыдущей. Проверки относительно сложны, так что их не записать в качестве одного длинного if'а. Логика происходящего абсолютно прозрачна. Но тебе приходится делать три вложенных блока, или трюк с while(1), или выделять это всё в отдельную функцию, что вовсе необязательно имеет смысл делать.