Re[8]: Почему в перле условия пишут за действием
От: Vamp Россия  
Дата: 10.02.10 19:11
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, Vamp, Вы писали:


N>>>Вообще, если выделение блока обязательно, то else if сишного типа само по себе было бы недопустимо — пришлось бы писать else { if ... }, так что перловый elsif вызван отнюдь не жёсткой необходимостью.

V>>Тебе не кажется, что ты сам себе противоречишь?
N>с чего вдруг?
Выделил жирным твои собственные слова. Из них следует, что elsif вызван необходимостью.

N>ты вообще в курсе различия семантики elsif и else?

Я да. Ты, я вижу, тоже. Я в недоумении.

N>он и сейчас в Си и наследниках это позволяет. результат ужасен.

Обоснуй выделенное.
Да здравствует мыло душистое и веревка пушистая.
Re[9]: Почему в перле условия пишут за действием
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.02.10 20:58
Оценка:
Здравствуйте, 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 такой проблемой не обладает — структура кода совпадает с ожидаемой программистом.
The God is real, unless declared integer.
Re[10]: Почему в перле условия пишут за действием
От: Vamp Россия  
Дата: 10.02.10 21:01
Оценка:
N>Нет. Необходимости тут вообще нет — потому что достаточно арифметического IF.
Что такое "арифметическое IF"?

N> Я говорю о том, что сишная цепочка else if'ов, которые на самом деле вложенные, а по синтаксису отступов — нет,

C какой точки зрения они вложенные?

N>происходит нарушение адекватности реальной синтаксической структуры задумке программиста и его желанию видеть данный код — потому что реальная структура такая:

Нет, я так и не понял, что ты имеешь в виду. Все работает именно, так как ожидается, запись соответствует логическому представлению — в чем, собственно, проблемма?
Да здравствует мыло душистое и веревка пушистая.
Re[11]: Почему в перле условия пишут за действием
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.02.10 21:08
Оценка:
Здравствуйте, 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>Нет, я так и не понял, что ты имеешь в виду. Все работает именно, так как ожидается, запись соответствует логическому представлению — в чем, собственно, проблемма?

Нет, не соответствует.
The God is real, unless declared integer.
Re[12]: Почему в перле условия пишут за действием
От: Vamp Россия  
Дата: 10.02.10 21:12
Оценка:
N>if (выражение) метка1, метка2, метка3
N>конструкция раннего Фортрана.

Ну хай живе. Вопрос, какое отношение это имеет к Perl, я даже поднимать не буду.

N>Нет, не соответствует.

Отчего же не соотвутствуют? Работают именно так, как хотелось бы,

if (A) {
   op1();
} else if (B) {
   op2();
} else if (C) {
   op3()
}

Означают именно то, что написано — если А, то делай op1, иначе если В, то ор2, а иначе если С — то ор3. Где тут несоответствие?
Да здравствует мыло душистое и веревка пушистая.
Re[13]: Почему в перле условия пишут за действием
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.02.10 21:33
Оценка:
Здравствуйте, Vamp, Вы писали:

N>>if (выражение) метка1, метка2, метка3

N>>конструкция раннего Фортрана.

V>Ну хай живе. Вопрос, какое отношение это имеет к Perl, я даже поднимать не буду.


Отношение очень простое: когда речь о том, какие средства _достаточны_, не надо уходить в крайности.:)

N>>Нет, не соответствует.

V>Отчего же не соотвутствуют? Работают именно так, как хотелось бы,

V>
V>if (A) {
V>   op1();
V>} else if (B) {
V>   op2();
V>} else if (C) {
V>   op3()
V>}
V>

V>Означают именно то, что написано — если А, то делай op1, иначе если В, то ор2, а иначе если С — то ор3. Где тут несоответствие?

У тебя отступы некорректны.
The God is real, unless declared integer.
Re[14]: Почему в перле условия пишут за действием
От: Vamp Россия  
Дата: 10.02.10 21:35
Оценка:
V>>
V>>if (A) {
V>>   op1();
V>>} else if (B) {
V>>   op2();
V>>} else if (C) {
V>>   op3()
V>>}
V>>

V>>Означают именно то, что написано — если А, то делай op1, иначе если В, то ор2, а иначе если С — то ор3. Где тут несоответствие?
N>У тебя отступы некорректны.

Нет, ты так и не объяснил, относительно чего они некоректны. Относительно того, что с точки зрения разворачивания дерева else if будут относится к предыдущему if, а не к первому? А мне-то что с того, если работает все именно так, как я ожидаю?
Да здравствует мыло душистое и веревка пушистая.
Re[15]: Почему в перле условия пишут за действием
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.02.10 21:41
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Нет, ты так и не объяснил, относительно чего они некоректны. Относительно того, что с точки зрения разворачивания дерева else if будут относится к предыдущему if, а не к первому? А мне-то что с того, если работает все именно так, как я ожидаю?


"Всё работает" ровно тогда, когда ты знаешь и постоянно помнишь, что это хоть формально и одноуровневая структура, но реально — вложенная. Как только ты об этом забудешь, а код усложнится — жди беды.
The God is real, unless declared integer.
Re[16]: Почему в перле условия пишут за действием
От: Vamp Россия  
Дата: 10.02.10 21:44
Оценка:
N>"Всё работает" ровно тогда, когда ты знаешь и постоянно помнишь, что это хоть формально и одноуровневая структура, но реально — вложенная. Как только ты об этом забудешь, а код усложнится — жди беды.
Давай сразу с примерами.
Да здравствует мыло душистое и веревка пушистая.
Re[17]: Почему в перле условия пишут за действием
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.02.10 22:02
Оценка:
Здравствуйте, Vamp, Вы писали:

N>>"Всё работает" ровно тогда, когда ты знаешь и постоянно помнишь, что это хоть формально и одноуровневая структура, но реально — вложенная. Как только ты об этом забудешь, а код усложнится — жди беды.

V>Давай сразу с примерами.

if (a1)
  b1;
else if (a2)
  if (c1)
    d1;
  else if (c2)
    d2;
else if(a3)
  b3;


это простой пример, бывают похитрее.
принудительные скобки в стиле Perl избавляют от проблем в таких ситуациях. Не зря Вирт в Модуле ввёл их — на отрицательном опыте Паскаля.
The God is real, unless declared integer.
Re[18]: Почему в перле условия пишут за действием
От: Cyberax Марс  
Дата: 10.02.10 22:12
Оценка: +1
Здравствуйте, netch80, Вы писали:

N>это простой пример, бывают похитрее.

Честно говоря, я такие примеры видел только в аргументах тех, кто за/против elseif.
Sapienti sat!
Re[19]: Почему в перле условия пишут за действием
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 11.02.10 07:05
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, netch80, Вы писали:


N>>это простой пример, бывают похитрее.

C>Честно говоря, я такие примеры видел только в аргументах тех, кто за/против elseif.

Значит, ты вообще мало кода читаешь.;) Подобные вложенные цепочки условий встречаются постоянно.
The God is real, unless declared integer.
Re[2]: Почему в перле условия пишут за действием
От: anonymous Россия http://denis.ibaev.name/
Дата: 11.02.10 10:11
Оценка:
Здравствуйте, Vamp, Вы писали:

А>>Зачем так сделано?

V>Основная причина в том, что блок после if должен заключаться в фигурные скобки, даже если там всего одна строчка. Вот для того, чтобы убрать необходимость в фигурных скобках, придумана такая запись.

Ничего подобного, избавиться от блока можно проще, без всяких изменений синтаксиса языка, так:
condition and action();
Re: Почему в перле условия пишут за действием
От: Аноним  
Дата: 26.02.10 14:36
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А>Последние пару месяцев пишу утилиту на перле(вернее переписываю) и никак не могу привыкнуть в перле условия пишут за действием.

А>Типа такого
А>
$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
}

Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.