глупый программистский вопрос
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 06:35 am (UTC)(no subject)
From:(no subject)
From:Re:
From:no subject
Date: 2003-04-12 05:28 am (UTC)Теория структурного программирования плюс структурно-функциональный дизайн (Йордон) плюс практика алгольного семейства языков.
no subject
Date: 2003-04-12 07:52 am (UTC)no subject
Ещё в C нужен способ определить cleanup (напр. определить, что ресурс, запрошенный в начале функции или блока должен быть освобожден при любом выходе из нее/него), и способ определить структуру состоящую из заголовка за которым следует часть, которая повторяется неизвестное при компиляции число раз вроде
где для namеtable выделяется место для заголовка и массива names из 100 элементовRe:
Date: 2003-04-12 07:24 am (UTC)В C, по-моему, нет cleanup'а по двум причинам, в чём-то друг от друга зависящим: во-первых, железо начала 70-х (речь идёт не о мейнфреймах, конечно) его плохо поддерживало; во-вторых, C изначально был задуман как язык, в котором все переходы контроля абсолютно прозрачны для программиста. В C никогда ничего не происходит "за кулисами" с точки зрения выполнения каких-то команд. Именно поэтому сторонники других языков любят называть C макроассемблером, но, с другой стороны, это идеально подходит для системного кода, для realtime-кода, и вообще во всех случаях, когда программист должен более или менее чётко представлять, что происходит во время исполнения вот этой конкретной строки кода.
Структура динамического размера - да, было бы удобно, хотя это syntactic sugar, по сути дела.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2003-04-12 09:29 am (UTC)cleanup есть в расширениях Visual C++: __try / __finally. Также в Visual C++ есть подобная структура: names[0];.
Re:
From:Re:
From:(no subject)
From:Re:
From:no subject
Date: 2003-04-12 08:41 pm (UTC)во всех современных языках есть try-finally, которая для этого и предназначена.
no subject
Date: 2003-04-12 06:15 am (UTC)Я думаю, что это тяжелое наследие Паскаля, в котором, как мне помнится, нет выхода из цикла по BREAK.
no subject
Date: 2003-04-12 07:29 am (UTC)В Oberon тоже есть.
В GNU Pascal тоже есть.
Нету только в виртовском.
Re:
From:(no subject)
From:(no subject)
From:(no subject)
From: (Anonymous) - Date: 2003-04-12 02:11 pm (UTC) - ExpandRe: Re:
From:(no subject)
From:no subject
Date: 2003-04-12 07:39 am (UTC)no subject
Date: 2003-04-12 06:17 am (UTC)no subject
Date: 2003-04-12 06:52 am (UTC)Сколько хороших вещей можно сделать с CPS-ным кодом, о боже мой.
...
From:(no subject)
From:Re:
From:(no subject)
From:(no subject)
From:(no subject)
From: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)
From:(no subject)
From:Re:
From:(no subject)
From:no subject
Date: 2003-04-12 06:29 am (UTC)Это "скрытый" оператор перехода. В некоторых из тех языков, в которых он есть (и даже есть полноценный оператор перехода), эти идеологические уступки стараются не афишировать :)
Если память мне не изменяет, то в фирменном учебнике по борландовскому паскалю примеры с операторами перехода отсутствовали (что не мешало существовать им самим в борландовской версии паскаля - или путаю?).
no subject
Date: 2003-04-12 07:30 am (UTC)Оба можно назвать "скрытыми операторами перехода" в одинаковой мере. Если есть первый, почему бы "за ту же цену" не предоставить второй?
no subject
Date: 2003-04-12 06:37 am (UTC)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 11:59 am (UTC)Да, в стандарте это давно исправлено (стандарт был только один, в 1998 году кажется; драфты с этим исправлением появились еще раньше). Удивительно, что в MSVC это не только осталось "по старому", но даже и переключателя не появилось для "нового" поведения (во всяком случае так было до самого последнего времени) -- очень неудобно многоплатформенные программы писать.
(no subject)
From:(no subject)
From:Re:
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2003-04-12 08:55 am (UTC)Re:
Date: 2003-04-12 08:59 am (UTC)Ситуация: тебе нужно сделать одну проверку; если она проходит, вторую; если эта проходит, третью, и если третья проходит, выполнить некую нетривиальную последовательность действий. Возможность проведения каждой провеки зависит от успеха предыдущей. Проверки относительно сложны, так что их не записать в качестве одного длинного if'а. Логика происходящего абсолютно прозрачна. Но тебе приходится делать три вложенных блока, или трюк с while(1), или выделять это всё в отдельную функцию, что вовсе необязательно имеет смысл делать.
это вообще просто
From:no subject
Date: 2003-04-12 10:48 am (UTC)polagaju 4to tak slo*ilos' isklju4itel'no istori4eski... nu i pljus kone4no opredelennaja stepen' leni razrabot4ikov C.
no subject
Date: 2003-04-12 11:34 am (UTC)no subject
Date: 2003-04-12 12:35 pm (UTC)no subject
exit [loop_name] [when condition];
в REXX тоже есть:
leave [var_name];
Так что в нормальных языках всё есть :)
Re:
Date: 2003-04-12 03:27 pm (UTC)no subject
Date: 2003-04-12 05:38 pm (UTC)как нету?
Date: 2003-04-12 08:51 pm (UTC)Re: как нету?
From:Re: как нету?
From:Re: как нету?
From: (Anonymous) - Date: 2003-04-14 06:48 am (UTC) - ExpandRe: как нету?
From:Re: как нету?
From: (Anonymous) - Date: 2003-04-16 03:28 am (UTC) - ExpandRe: как нету?
From:no subject
Date: 2003-04-13 05:13 pm (UTC)#define leave goto
...
block( foo ) {
...
leave foo;
}
))
Re:
Date: 2003-04-14 03:37 am (UTC)a paaachemu?
From: (Anonymous) - Date: 2003-04-14 06:50 am (UTC) - Expand