Здравствуйте, netch80, Вы писали:
N>Здравствуйте, Vamp, Вы писали:
N>>>Вообще, если выделение блока обязательно, то else if сишного типа само по себе было бы недопустимо — пришлось бы писать else { if ... }, так что перловый elsif вызван отнюдь не жёсткой необходимостью. V>>Тебе не кажется, что ты сам себе противоречишь? N>с чего вдруг?
Выделил жирным твои собственные слова. Из них следует, что elsif вызван необходимостью.
N>ты вообще в курсе различия семантики elsif и else?
Я да. Ты, я вижу, тоже. Я в недоумении.
N>он и сейчас в Си и наследниках это позволяет. результат ужасен.
Обоснуй выделенное.
Здравствуйте, Vamp, Вы писали:
V>Здравствуйте, netch80, Вы писали:
N>>Здравствуйте, Vamp, Вы писали:
N>>>>Вообще, если выделение блока обязательно, то else if сишного типа само по себе было бы недопустимо — пришлось бы писать else { if ... }, так что перловый elsif вызван отнюдь не жёсткой необходимостью. V>>>Тебе не кажется, что ты сам себе противоречишь? N>>с чего вдруг? V>Выделил жирным твои собственные слова. Из них следует, что elsif вызван необходимостью.
Нет. Необходимости тут вообще нет — потому что достаточно арифметического IF. Я говорю о том, что сишная цепочка else if'ов, которые на самом деле вложенные, а по синтаксису отступов — нет, диверсия и нормализовать её мог бы как раз честный elsif, как бы он ни назывался. В перле можно было бы ничего не нарушив синтаксически написать не elsif, а else if, как это сделано в Фортране (77). А вот если не обязывать вести рамки блока — то уже таки потребуется отдельное слово, не совпадающее с известными.
N>>он и сейчас в Си и наследниках это позволяет. результат ужасен. V>Обоснуй выделенное.
Когда ты пишешь
if (cond1)
action1;
else if (cond2)
action2;
else if (cond3)
action3;
else
action4;
происходит нарушение адекватности реальной синтаксической структуры задумке программиста и его желанию видеть данный код — потому что реальная структура такая:
if (cond1)
action1;
else if (cond2)
action2;
else if (cond3)
action3;
else
action4;
Я даже встречал случай, когда на последовательности с полсотни таких проверок у компилятора переполнился стек разбора. Да, это тяжёлое 16-битное детство, но всё же.
Честный elsif такой проблемой не обладает — структура кода совпадает с ожидаемой программистом.
N>Нет. Необходимости тут вообще нет — потому что достаточно арифметического IF.
Что такое "арифметическое IF"?
N> Я говорю о том, что сишная цепочка else if'ов, которые на самом деле вложенные, а по синтаксису отступов — нет,
C какой точки зрения они вложенные?
N>происходит нарушение адекватности реальной синтаксической структуры задумке программиста и его желанию видеть данный код — потому что реальная структура такая:
Нет, я так и не понял, что ты имеешь в виду. Все работает именно, так как ожидается, запись соответствует логическому представлению — в чем, собственно, проблемма?
Здравствуйте, Vamp, Вы писали:
N>>Нет. Необходимости тут вообще нет — потому что достаточно арифметического IF. V>Что такое "арифметическое IF"?
if (выражение) метка1, метка2, метка3
аналогично сишной конструкции
{int x = выражение;
if (x < 0) goto метка1; if (x == 0) goto метка2; goto метка3;
}
конструкция раннего Фортрана.
N>> Я говорю о том, что сишная цепочка else if'ов, которые на самом деле вложенные, а по синтаксису отступов — нет, V>C какой точки зрения они вложенные?
Ты моё сообщение прочитал, или как? Если нет — читай пока не увидишь.
N>>происходит нарушение адекватности реальной синтаксической структуры задумке программиста и его желанию видеть данный код — потому что реальная структура такая: V>Нет, я так и не понял, что ты имеешь в виду. Все работает именно, так как ожидается, запись соответствует логическому представлению — в чем, собственно, проблемма?
N>if (выражение) метка1, метка2, метка3 N>конструкция раннего Фортрана.
Ну хай живе. Вопрос, какое отношение это имеет к Perl, я даже поднимать не буду.
N>Нет, не соответствует.
Отчего же не соотвутствуют? Работают именно так, как хотелось бы,
if (A) {
op1();
} else if (B) {
op2();
} else if (C) {
op3()
}
Означают именно то, что написано — если А, то делай op1, иначе если В, то ор2, а иначе если С — то ор3. Где тут несоответствие?
Здравствуйте, Vamp, Вы писали:
N>>if (выражение) метка1, метка2, метка3 N>>конструкция раннего Фортрана.
V>Ну хай живе. Вопрос, какое отношение это имеет к Perl, я даже поднимать не буду.
Отношение очень простое: когда речь о том, какие средства _достаточны_, не надо уходить в крайности.:)
N>>Нет, не соответствует. V>Отчего же не соотвутствуют? Работают именно так, как хотелось бы,
V>
V>>Означают именно то, что написано — если А, то делай op1, иначе если В, то ор2, а иначе если С — то ор3. Где тут несоответствие? N>У тебя отступы некорректны.
Нет, ты так и не объяснил, относительно чего они некоректны. Относительно того, что с точки зрения разворачивания дерева else if будут относится к предыдущему if, а не к первому? А мне-то что с того, если работает все именно так, как я ожидаю?
Здравствуйте, Vamp, Вы писали:
V>Нет, ты так и не объяснил, относительно чего они некоректны. Относительно того, что с точки зрения разворачивания дерева else if будут относится к предыдущему if, а не к первому? А мне-то что с того, если работает все именно так, как я ожидаю?
"Всё работает" ровно тогда, когда ты знаешь и постоянно помнишь, что это хоть формально и одноуровневая структура, но реально — вложенная. Как только ты об этом забудешь, а код усложнится — жди беды.
N>"Всё работает" ровно тогда, когда ты знаешь и постоянно помнишь, что это хоть формально и одноуровневая структура, но реально — вложенная. Как только ты об этом забудешь, а код усложнится — жди беды.
Давай сразу с примерами.
Здравствуйте, Vamp, Вы писали:
N>>"Всё работает" ровно тогда, когда ты знаешь и постоянно помнишь, что это хоть формально и одноуровневая структура, но реально — вложенная. Как только ты об этом забудешь, а код усложнится — жди беды. V>Давай сразу с примерами.
if (a1)
b1;
else if (a2)
if (c1)
d1;
else if (c2)
d2;
else if(a3)
b3;
это простой пример, бывают похитрее.
принудительные скобки в стиле Perl избавляют от проблем в таких ситуациях. Не зря Вирт в Модуле ввёл их — на отрицательном опыте Паскаля.
Здравствуйте, netch80, Вы писали:
N>это простой пример, бывают похитрее.
Честно говоря, я такие примеры видел только в аргументах тех, кто за/против elseif.
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, netch80, Вы писали:
N>>это простой пример, бывают похитрее. C>Честно говоря, я такие примеры видел только в аргументах тех, кто за/против elseif.
Значит, ты вообще мало кода читаешь.;) Подобные вложенные цепочки условий встречаются постоянно.
Здравствуйте, Vamp, Вы писали:
А>>Зачем так сделано? V>Основная причина в том, что блок после if должен заключаться в фигурные скобки, даже если там всего одна строчка. Вот для того, чтобы убрать необходимость в фигурных скобках, придумана такая запись.
Ничего подобного, избавиться от блока можно проще, без всяких изменений синтаксиса языка, так:
Здравствуйте, Аноним, Вы писали:
А>Последние пару месяцев пишу утилиту на перле(вернее переписываю) и никак не могу привыкнуть в перле условия пишут за действием. А>Типа такого А>
$myVar = sumFunc() if $extVar ne 'bla-bla-bla';
А>Зачем так сделано? А>В чем удобство?
perlcritic
Postfix control "if" used at
ControlStructures::ProhibitPostfixControls (Severity: 2)
Conway discourages using postfix control structures (`if', `for',
`unless', `until', `while') because they hide control flow. The `unless'
and `until' controls are particularly evil because they lead to
double-negatives that are hard to comprehend. The only tolerable usage
of a postfix `if' is when it follows a loop break such as `last',
`next', `redo', or `continue'.
do_something() if $condition; #not ok
if($condition){ do_something() } #ok
do_something() while $condition; #not ok
while($condition){ do_something() } #ok
do_something() unless $condition; #not ok
do_something() unless ! $condition; #really bad
if(! $condition){ do_something() } #ok
do_something() until $condition; #not ok
do_something() until ! $condition; #really bad
while(! $condition){ do_something() } #ok
do_something($_) for @list; #not ok
LOOP:
for my $n (0..100){
next if $condition; #ok
last LOOP if $other_condition; #also ok
}