Автор Тема: Про необходимость for(each)  (Прочитано 53435 раз)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Про необходимость for(each)
« : Февраль 07, 2012, 04:17:42 pm »
Внезапно на oberoncore появилось ценное свидетельство того, что ни долгие годы самодисциплины, ни мощная идеалогическая основа не спасают от глупых ошибок в циклах: http://forum.oberoncore.ru/viewtopic.php?f=2&t=3824
Цитата: Евгений Темиргалеев
На обсуждение указанного тормоза, который в линухах вообще не работает, наложилось утреннее зависание ББ (забыл INC в наскоро слепленном цикле) с последующем выискиванием и удалением нескольких временных файлов.

То есть самый общий цикл -- WHILE (и его конструкты вроде цикла Дейкстры) явно и очевидно недостаточен для качественного написания софта. В языке (либо в библиотеке, если язык позволяет это сделать) нужны более частные, узкозаточенные, конструкции которые не позволяют зевающему программисту натворить глупых ошибок. В том числе конструкции не тьюринг-полные. Ну, например тот же foreach (который обычно вшивают в язык императивный), или fold/map (которые обычно в функциональных языка и в виде либы).

Кстати, даже банальный сишный for обычно более багозащищен нежели while. Потому как мгновенно вырабатывается паттерн: for (int i=0; i<len; ++i) и погнали. Это на уровне рефлексов без задействования думалки вообще. Ибо все в одной строчке. А уж про Адский for я вообще молчу - там ошибиться еще сложнее.

Я за последние полгода сам пару раз напарывался на зевок в виде забытого инкремента в while (забывал либо я либо один из коллег). И ни разу этого не было в for. Про foreach я и не говорю даже.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Vartovyj

  • Full Member
  • ***
  • Сообщений: 197
    • Просмотр профиля
Re: Про необходимость for(each)
« Ответ #1 : Февраль 07, 2012, 04:31:49 pm »
Ну, так не даром его Вирт вернул в Оберон-2

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Про необходимость for(each)
« Ответ #2 : Февраль 07, 2012, 04:37:59 pm »
Ну, так не даром его Вирт вернул в Оберон-2
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Vartovyj

  • Full Member
  • ***
  • Сообщений: 197
    • Просмотр профиля
Re: Про необходимость for(each)
« Ответ #3 : Февраль 07, 2012, 04:47:05 pm »
На соседнем форуме вроде было обсуждение, про расширенные возможности FOR'а

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Про необходимость for(each)
« Ответ #4 : Февраль 07, 2012, 04:48:13 pm »
На соседнем форуме вроде было обсуждение, про расширенные возможности FOR'а
Гм. В смысле, расширенные?
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Про необходимость for(each)
« Ответ #5 : Февраль 07, 2012, 04:53:07 pm »
Ну, например тот же foreach (который обычно вшивают в язык императивный), или fold/map (которые обычно в функциональных языка и в виде либы).
Ну, нужен foreach/map, а кто с этим спорит?
Вот сишная конструкция for  - редкостное дерьмо. Хотя хорошо работает как костыль.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Про необходимость for(each)
« Ответ #6 : Февраль 07, 2012, 04:55:51 pm »
Ну, например тот же foreach (который обычно вшивают в язык императивный), или fold/map (которые обычно в функциональных языка и в виде либы).
Ну, нужен foreach/map, а кто с этим спорит?
Вот сишная конструкция for  - редкостное дерьмо. Хотя хорошо работает как костыль.
Ну, оно мгновенно становится дерьмом как только человек прочитает спеку на язык и поймет чего туда можно, на самом деле насувать :-)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Про необходимость for(each)
« Ответ #7 : Февраль 07, 2012, 04:56:51 pm »
Ну, так не даром его Вирт вернул в Оберон-2
А х. толку -  for полезен когда известно  количество повторений тела цикла, а безопасным он становится, когда заголовок вычисляется ОДИН раз.  В Обероне FOR (как я понял) всего лишь надстройка над WHILE

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Про необходимость for(each)
« Ответ #8 : Февраль 07, 2012, 06:46:29 pm »
Раз в год можно не только INC забыть, но и множество других вещей сделать по усталости. И компилятор съест. Проблема высосана из пальца. Вдобавок, если не руками цикл набирать, то вставленный шаблон может уже содержать INC(XXX), где нужно лишь XXX заменить или удалить всю строку.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Про необходимость for(each)
« Ответ #9 : Февраль 07, 2012, 06:56:32 pm »
Раз в год можно не только INC забыть, но и множество других вещей сделать по усталости. И компилятор съест. Проблема высосана из пальца. Вдобавок, если не руками цикл набирать, то вставленный шаблон может уже содержать INC(XXX), где нужно лишь XXX заменить или удалить всю строку.

То же самое можно сказать вообще про всю проблему циклов с такой любовью обсасываемую на оборонкоре :) Включая неприкосновенный цикл Дейкстры. Нет у нормальных людей проблем с циклами, даже если там break стоит. Точнее этих проблем не больше, чем "забытых INC" у адептов идеи всезначимости "правильного" построения.

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Про необходимость for(each)
« Ответ #10 : Февраль 07, 2012, 07:46:13 pm »
Это точно, "нормальные" люди считают, что у них нет проблем. Иногда, правда, приходится напрячься, ну так можно написать вот такую херню, как эта от микрософтовцев http://forum.oberoncore.ru/viewtopic.php?p=53637#p53637 . Но считать это проблемой просто смешно. Есть вещи поважнее.
А вот интересно, как нормальный человек решит такую задачу: массив заполнен целыми числами от 1 до 3. Нужно отсортировать его по возрастанию.
Точнее, я знаю, как решит нормальный - применит какой-нибудь универсальную сортировку и даже не поморщится.
Но ведь задача-то простая, неужели нельзя самому решить?
Попробуйте, обращаюсь конкретно к vlad'у и всем заинтересованным лицам, и напишите комментарии. Честно говоря, у меня мозги забиты, и я вообще не представляю, как пойдет процесс.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Про необходимость for(each)
« Ответ #11 : Февраль 07, 2012, 08:10:55 pm »
Это точно, "нормальные" люди считают, что у них нет проблем. Иногда, правда, приходится напрячься, ну так можно написать вот такую херню, как эта от микрософтовцев http://forum.oberoncore.ru/viewtopic.php?p=53637#p53637 . Но считать это проблемой просто смешно.

Конкретно это херня "ненормальная". Хотя там и есть break :) Хотя бывает и хуже :) Это если интересно мое личное мнение.

Есть вещи поважнее.
А вот интересно, как нормальный человек решит такую задачу: массив заполнен целыми числами от 1 до 3. Нужно отсортировать его по возрастанию.
Точнее, я знаю, как решит нормальный - применит какой-нибудь универсальную сортировку и даже не поморщится.
Но ведь задача-то простая, неужели нельзя самому решить?
Попробуйте, обращаюсь конкретно к vlad'у и всем заинтересованным лицам, и напишите комментарии. Честно говоря, у меня мозги забиты, и я вообще не представляю, как пойдет процесс.

Конкретно я - да, применю стандартную сортировку. Да, я понимаю, что можно заложиться на особенность диапазона и круто соптимизить. Но нах. Сопровождение важнее.

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Про необходимость for(each)
« Ответ #12 : Февраль 07, 2012, 08:48:52 pm »
А вот интересно, как нормальный человек решит такую задачу: массив заполнен целыми числами от 1 до 3. Нужно отсортировать его по возрастанию
Я сделаю чисто по индусски:
 :)
int n1 = 0, n2 = 0, i = 0;
while (i < length)
{
  switch (a[i++])
  {
    case 1: n1++; break;
    case 2: n2++; break;
  }
}
i = 0;
while (i < n1)
{
  a[i++] = 1;
}
while (i < n1+n2)
{
  a[i++] = 2;
}
while (i < length)
{
  a[i++] = 3;
}
« Последнее редактирование: Февраль 07, 2012, 08:51:32 pm от Губанов Сергей Юрьевич »

DIzer

  • Гость
Re: Про необходимость for(each)
« Ответ #13 : Февраль 07, 2012, 10:02:10 pm »
Это точно, "нормальные" люди считают, что у них нет проблем. Иногда, правда, приходится напрячься, ну так можно написать вот такую херню, как эта от микрософтовцев http://forum.oberoncore.ru/viewtopic.php?p=53637#p53637 . Но считать это проблемой просто смешно. Есть вещи поважнее.
А вот интересно, как нормальный человек решит такую задачу: массив заполнен целыми числами от 1 до 3. Нужно отсортировать его по возрастанию.
Точнее, я знаю, как решит нормальный - применит какой-нибудь универсальную сортировку и даже не поморщится.
Но ведь задача-то простая, неужели нельзя самому решить?
Попробуйте, обращаюсь конкретно к vlad'у и всем заинтересованным лицам, и напишите комментарии. Честно говоря, у меня мозги забиты, и я вообще не представляю, как пойдет процесс.
Классика жанра - сортировка подсчетом сложность 2*N -первый прогон подсчет количества значений, второй их расстановка в исходном массиве - не фиг думать

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Про необходимость for(each)
« Ответ #14 : Февраль 07, 2012, 10:09:39 pm »
Вот в один прогон. Вроде, не накосячил. Есть поле для оптимизации.

cl, cr, x, tmp : INTEGER;

x := 0;
cl := 0;
cr := LEN( a );
WHILE x < cr DO
IF a[x] = 1 THEN
tmp := a[cl]; a[cl] := a[x]; a[x] := tmp;
cl := cl + 1;
ELSIF a[x] = 3 THEN
tmp := a[cr]; a[cr] := a[x]; a[x] := tmp;
cr := cr + 1;
END
x := x + 1
END