Здравствуйте, moudrick, Вы писали:
M>Позвольте раз в жизни согласиться с Сергеем Губановым (отпишусь-ка я на всякий случай от этой ветки, а то страшненько :maniac:). M>Ассерт тут по смыслу очень даже правильный.
Зависит от ситуации. Я вот не могу вспомнить реального случая, чтобы мне такой ассерт после цикла понадобился.
M>(вода поскипана)
Никто и не наезжал на ассерты вообще. Любой сишник, думаю, подтвердит, что ассерты рулят.
Другое дело, что программер ставит ассерты там, где ему надо.
А в Обероне эти ассерты насильно впаривает компилятор, даже если они тебе здесь нафиг не нужны: ну вот не собираешься ты использовать n дальше, и все тут (как обычно и бывает, кстати: это настолько частый вариант, что синтаксис С++ специально был расширен, позволяя объявлять переменные прямо в условиях if и while, и сократив видимость обявления в for), зато собираешься выйти из середины цикла без лишних плясок с условием цикла.
В результате из-за этого ненужного в большинстве случаев встроенного ассерта программист не может выразить свою мысль понятным способом при помощи цикла WHILE, а обречен извращаться с LOOP.
Здравствуйте, Mamut, Вы писали:
P>>Это, IMHO, стандартный метод превращения дискуссии во флейм. Вместо ответа по существу — выпячивание мелочей и игнорирование сути.
M>Какой-то ответ
там все же появился. Советую почитать. Я долго смеялся
Да, я видел. По-моему, даже отметился. Что-то насчет классиков. Правда, это не поможет...
P>>P.S. А BEGIN в Обероне существует! А кто-то кричал не своим голосом, что нет и что это устаревший синтаксис.
M>"А она все же вертится"
M>И, хотя это являтся оффтопиком для данной подветки, еще одно замечание: M>
M>// С++
M>if(data != expectedData) // сравниваем две переменные, видно из кода
M>{* Oberon *}
M>IF data # expectedData THEN // сравинваем две переменные?
M> // переменную и значение функции?
M> // значения двух функций?
M>
M>Наглядность языка? Где? Не вижу.
То есть в С++ разницу видно, а в Обероне нет? Странно. Может очки каие надо?
J>Никто и не наезжал на ассерты вообще. Любой сишник, думаю, подтвердит, что ассерты рулят.
J>Другое дело, что программер ставит ассерты там, где ему надо.
J>А в Обероне эти ассерты насильно впаривает компилятор, даже если они тебе здесь нафиг не нужны: ну вот не собираешься ты использовать n дальше, и все тут (как обычно и бывает, кстати: это настолько частый вариант, что синтаксис С++ специально был расширен, позволяя объявлять переменные прямо в условиях if и while, и сократив видимость обявления в for), зато собираешься выйти из середины цикла без лишних плясок с условием цикла.
J>В результате из-за этого ненужного в большинстве случаев встроенного ассерта программист не может выразить свою мысль понятным способом при помощи цикла WHILE, а обречен извращаться с LOOP.
Если программист не может выразить свою мысль понятным способом на родном(?) языке, ему уже ничего не поможет.
пост. Очень сильно напоминает поведение оскорблённого подростка, который при любом более-менее подходящем случае стремится обозвать любого так же, как назвали его.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
WARNING: expression "to_be || !to_be" is always true
P>Он не только оппонентов, он и классику не читает. Сейчас вряд ли найду, но эти положения у Вирта обсуждаются. Видимо, он и его не читал. О чем тогда еще говорить?
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Не надо быть прорицателем, чтобы понять, что реальная цель у аспиранта Страуструпа была защитить диссеру чтобы его взяли на работу.
О, на постсоветский НИИ похоже. Там надо защищать диссертацию, чтобы должность получить от завлаба или завсектором. Впрочем, у директора НИИ, где я работал, ученой степени не было.
Кстати, удачный пример, когда диссертационная работа получила такую реакцию общественности. Кстати, а изобретение Паскаля Виртом не преследовало те же цели?
SAV>Плохое построение цикла. В идеале у цикла должен быть один вход (никаких goto центр_цикла и прочих извращений) и один выход (выход только по условию цикла или только по одному break при while(true) ).
Кто это сказал? Кто этот мудрец, скажите мне, я хочу в глаза ему посмотреть. Где этот идеальный академик, пишущий идеальные программы? Я хочу узнать сколько своих идеальных программ он написал за свою жизнь, что они выполняют и, главное, сколько продал?
К сожалению, я живу в реальном мире и пишу реальные программы с реальными циклами. А потому мне нужен брейк.
SAV> Кстати тут недавно было описание книги Совершенный код
Здравствуйте, Кодт, Вы писали:
CX>>Вот если бы были клавиатуры, на которых каждая клавиша — это готовая лексема, тогда, возможно, что-то изменилось бы.
К>ZX Spectrum, БК-001, ещё какие-то модели микрош-ириш такой фичей обладали. Одна кнопка — одна лексема васика. У БК и Спектрум они даже подписаны были (соответственно, имели несколько шифт-клавиш ).
Да, но зато некоторые особо злые ключевые слова приходилось набирать последовательностью комбинаций — { Caps+Symbol; Caps+буква; }, что не совсем чтобы способствовало скорости А так вообще идея размещения каждого понятия на отдельной клавише в пределе ведёт к китайской иероглифической клавиатуре… бррр…
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Да примерно так. Должна быть возможность глядя на программу понять опечатка в ней или так и надо. По крайней мере синтаксис должен быть таким чтобы минимизировать количество возможных односимвольных опечаток (как в данном случае ";" — односимвольная опечатка)
Кстати, кое-что еще добавлю. Насчет точки с запятой все современные компиляторы выдадут warning. Это не ошибка, но очень на нее похожа. Как это делается? Очень просто — скрещиванием фаз синтаксического и семантического анализа. Некрасиво? Да. Но реализуемо? Тоже да.
А естественные языки? Ведь написать корректную программу рабора фразы на английском (хотя бы) языке и получения точного ее смысла еще не удалось никому. Тем не менее это самый популярный язык в мире. А почему? Видимо, потому, что человеку важен не синтаксис.
M>>>"Не плоди сущностей без необходимости" LOOP — такая вот ненужная сущность. СГ>>Странно, а если нужно проверить условие прекращения итерации уже находясь внутри итерации, тогда как быть? M>Вы издеваетесь? Посмотрите в практически любой другой язык программирования. M>
M>Для for и do аналогично. Какие могут быть насчет этого есть проблемы?
Просто какой-то академик решил, что будет хорошо, если всегда на выходе из цикла cond будет ложным. Кому хорошо? Почему хорошо? Какая от этого практическая польза программисту? На это я так и не услышал ответа.
Я отвечаю за свои слова, а не за то как вы их интерпретируете!
S>>А еще типичная ошибка — вместо "==" в условии поставить "="...
СГ>Ну да, точно. Как-то забыл упомянуть. Спасибо что напомнили. За одно только это си-образный синтаксис не имеет права существовать...
Надо на РСДН срочно внести новую оценку. Такую:
"ыыыыыыыыыыыыыыыыыыыыыыыы. "
Просто смайлика мне уже не хватает.
Открою страшную тайну — в РНР есть даже оператор "===". Какой кошмар, не правда ли?
А еще, а еще в С++ есть тернарный оператор ?: — какой ужас, батюшки!
А уж за то, что С++ позполяет в десятки раз сократить количество кода только за счет использования скобок вместо THEN, BEGIN, END, DO — это вообще ужас. Расстрел без права переписки
СГ>1) Страуструп на момент придумывания им С++ был (еще совсем зелёным) аспирантом.
СГ>2) Лауреат премии Тьюринга Никлаус Вирт на момент создания Оберона был профессором и было ему где-то под пятьдесят.
СГ>Разница между первым "академическим проектом" аля курсовик и вторым Академическим проектом с большой буквы, огромна.
Первый используется в тысячах. если не десятках тысяч програмных продуктов по всему миру и является, по сути, самым успешным коммерческим языком на планете (по популярности — и только по популярности — с ним может поспорить только РНР, имхо).
А второй академический проект с большой буквы набрал с десяток последователей по всему миру? Ну ладно, сотню.
, за "задолбали", оказывается, могут наказать. Прошу Вас впредь быть поосторожнее.
Ну а по сути можете что-нибудь ответить? Повторяю вопрос:
Ну уверены вы, что p после цикла ложно, и какая великая польза от этого? Чем это облегчает жизнь программисту? Кроме дурацких ограничений и отсутствия гибкости не вижу никаких отличий.
Только пожалуйста, без ссылок на авторитеты ("как известно") и без указаний на то, что это требует какая-то парадигма программирования. Хочу знать: зачем это мне, программисту.
Я отвечаю за свои слова, а не за то как вы их интерпретируете!
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Socrat, Вы писали:
S>>А еще типичная ошибка — вместо "==" в условии поставить "="...
СГ>Ну да, точно. Как-то забыл упомянуть. Спасибо что напомнили. За одно только это си-образный синтаксис не имеет права существовать...
И соответствующее предупреждение компилятора:
"ComeauTest.c", line 4: warning: use of "=" where "==" may have been intended
if(i = 1);
^
Скажи честно, тебе самому не надоело еще фигней заниматься?
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, moudrick, Вы писали:
M>> С++, кстати, тоже начинался с академической разработки.
СГ>Академические проекты академическим проектам рознь.
СГ>1) Страуструп на момент придумывания им С++ был (еще совсем зелёным) аспирантом.
СГ>2) Лауреат премии Тьюринга Никлаус Вирт на момент создания Оберона был профессором и было ему где-то под пятьдесят.
СГ>Разница между первым "академическим проектом" аля курсовик и вторым Академическим проектом с большой буквы, огромна.
Ты вообще читаешь, что тебе пишут?
С++ не был академическим проектом!
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Cyberax, Вы писали:
C>>Плевать мне на теорию про три цикла. На _ПРАКТИКЕ_ (подчеркиваю C>>специально) нужен break для нормального кода.
СГ>Мне даже интересно стало. Может покажете пример?
Пожалуйста. Из недавне-жизненного, пусть и "своими словами". Первое:
// Классика: проход по самописному связному списку с поиском
// нужного элементаwhile (pItem->Next)
{
if (CheckItem(pItem))
break;
pItem = pItem->Next;
}
// И здесь ещё обработка найденного pItem...
Второе:
// Цикл по всему массиву некоторых объектов.for (DWORD i = 0; i < dwCount; i++)
{
// Здесь ведётся определённая обработка _и учёт_ этих объектов.
// Условия таковы, что обработка может закончиться где-то на середине
// списка, а может и дойти до конца в зависимости от некоторого обнаруженного
// условия. Т.е. объектов может быть и десять тысяч, но мы насчитаем нужное
// количество интересующих нас уже за первую дюжину.
WorkWithObject(pObjects[i]);
if (CalculateStat() > SOME_VALUE)
break;
}
// Здесь ещё продолжаем некоторую работу...
Теперь прошу Сергея представить версии без break. И не просто без break, а ещё и без уродства в духе
int Exit = 0;
while ((i < nCount) && !Exit)
{
if (Something(object[i]))
Exit = 1;
// И т.д.
i++;
}
Или аналогично уродливых разновидностей с for-ом...
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
WARNING: expression "to_be || !to_be" is always true
C++ was written by Bjarne Stroustrup at Bell Labs during 1983-1985. C++ is an extension of C. Prior to 1983, Bjarne Stroustrup added features to C and formed what he called "C with Classes"
Самый успешный Виртовский (Модула-2) и успешный Страуструповский (С++) языки были написаны для крупных исследовательских лабораторий крупнейших компаний Xerox и At&T, соответственно.
Сергею надо научиться поиском, что ли, пользоваться.
A>Теперь прошу Сергея представить версии без break. И не просто без break, а ещё и без уродства в духе A>
A>int Exit = 0;
A>while ((i < nCount) && !Exit)
A>{
A> if (Something(object[i]))
A> Exit = 1;
A> // И т.д.
A> i++;
A>}
A>
A>Или аналогично уродливых разновидностей с for-ом...
Это можно переписать с использованием LOOP, что будет не тем же самым как логически, так и синтаксически. А если использовать for, while, то придется вводить дополнительные логические пременные, то есть "уродства"