Автор Тема: Выход из цикла или смерть Кощея  (Прочитано 93593 раз)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #60 : Январь 15, 2013, 10:10:05 am »
Эти люди - электронщики. Не те которые процессора на fpga в VHDL делают, а те которые там платы разводят, под микроконтроллеры пишут и т.д.
Я когда-то таким же электронщиком-микроконтроллерщиком был, в PCAD'e/Компасе3D схемы/платы/чертежи рисовал, и ничего, нормально программный код воспринимал. Правда, предпочитал распечатывать, что бы не на маленьком экране, а на куче листов бумаги видеть...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #61 : Январь 15, 2013, 10:11:12 am »
Ада:
-- найти первый комплект без иглы
for i in сундуки'Range loop
    заяц := ЗАЯЦ(сундуки(i));   exit when заяц = null;
    утка := УТКА(заяц);         exit when утка = null;
    яйцо := ЯЙЦО(утка);         exit when яйцо = null;
    игла := ИГЛА(яйцо);         exit when игла = null;
end loop;

Нет принципиального отличия от моего варианта:
// Найти первый комплект без иглы -- низкоуровневая имитация монады Maybe
for (int i = 0; i < сундуки.Length; i++)
{
    заяц = сундуки[i];          if (заяц == null) break;
    утка = заяц.ИзвлечьУтку();  if (утка == null) break;
    яйцо = утка.ИзвлечьУтку();  if (яйцо == null) break;
    игла = яйцо.ИзвлечьУтку();  if (игла == null) break;
}
Принципиальной разницы, как и написал Петр Алмазов, действительно нет.
Но есть нюанс - exit when созданы друг для друга именно в контексте цикла, в отличае от if () break
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #62 : Январь 15, 2013, 10:14:56 am »
Но есть нюанс - exit when созданы друг для друга именно в контексте цикла, в отличае от if () break
Хм. А разве оператором break можно выйти откуда-то ещё кроме как из цикла?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #63 : Январь 15, 2013, 10:17:23 am »
Но есть нюанс - exit when созданы друг для друга именно в контексте цикла, в отличае от if () break
Хм. А разве оператором break можно выйти откуда-то ещё кроме как из цикла?
Конечно. Из switch.. case'а можно.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #64 : Январь 15, 2013, 10:27:35 am »
На Обероне я бы сделал, наверное, так:

PROCEDURE Store (obj: ANYPTR; VAR ptr: ANYPTR): BOOLEAN;
BEGIN
ptr := obj;
RETURN obj # NIL
END Store;

i := 0;
WHILE (i < сундуки.length) &
~( Store(ЗАЯЦ(сундуки[i]), заяц)) & Store(УТКА(заяц(Заяц)), утка)) &
Store(ЯЙЦО(утка(Утка)), яйцо)) & Store(ИГЛА(яйцо(Яйцо)), игла)) )
DO
INC(i)
END

Единственное, чтобы передать переменную по VAR-параметру, она должна иметь тип ANYPTR. Отсюда потом каждый раз приведение типа.
Во-первых. переусложнено (появилась дополнительная процедура).

Во-вторых я уже запутался - чем ЗАЯЦ, Заяц и заяц отличаются друг от друга? Вроде-бы изначально было ровно две сущности: ЗАЯЦ и заяц. А тут внезнапно третья появилась.

Короче, на Си такое пишется намного проще, понятней и компактней :-) Как говорится, наглядное преимущество Си (как потомка Algol-68).
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #65 : Январь 15, 2013, 10:29:04 am »
Но есть нюанс - exit when созданы друг для друга именно в контексте цикла, в отличае от if () break
Ооокей. Тогда так:

// Найти первый комплект без иглы -- низкоуровневая имитация монады Maybe
for (int i = 0; i < сундуки.Length; i++)
{
    заяц = сундуки[i];          if (заяц == null) goto exit;
    утка = заяц.ИзвлечьУтку();  if (утка == null) goto exit;
    яйцо = утка.ИзвлечьУтку();  if (яйцо == null) goto exit;
    игла = яйцо.ИзвлечьУтку();  if (игла == null) goto exit;
}
exit:;
;D
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #66 : Январь 15, 2013, 10:31:22 am »
Но есть нюанс - exit when созданы друг для друга именно в контексте цикла, в отличае от if () break
Ооокей. Тогда так:

// Найти первый комплект без иглы -- низкоуровневая имитация монады Maybe
for (int i = 0; i < сундуки.Length; i++)
{
    заяц = сундуки[i];          if (заяц == null) goto exit;
    утка = заяц.ИзвлечьУтку();  if (утка == null) goto exit;
    яйцо = утка.ИзвлечьУтку();  if (яйцо == null) goto exit;
    игла = яйцо.ИзвлечьУтку();  if (игла == null) goto exit;
}
exit:;
;D
Это усугубляет положение - goto еще более общая конструкция чем break.  и у него точно также как и у break нет никакой связи с if'ом (в отличие от пары exit when)
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #67 : Январь 15, 2013, 10:32:30 am »
Но есть нюанс - exit when созданы друг для друга именно в контексте цикла, в отличае от if () break
Ооокей. Тогда так:

// Найти первый комплект без иглы -- низкоуровневая имитация монады Maybe
for (int i = 0; i < сундуки.Length; i++)
{
    заяц = сундуки[i];          if (заяц == null) goto exit;
    утка = заяц.ИзвлечьУтку();  if (утка == null) goto exit;
    яйцо = утка.ИзвлечьУтку();  if (яйцо == null) goto exit;
    игла = яйцо.ИзвлечьУтку();  if (игла == null) goto exit;
}
exit:;
;D
омг, вот накопипастил ))) Вот что значит не проверять компилятором, компилятор наверняка бы поругался на несоответствие типов ))

// Найти первый комплект без иглы -- низкоуровневая имитация монады Maybe
for (int i = 0; i < сундуки.Length; i++)
{
    заяц = сундуки[i];          if (заяц == null) goto exit;
    утка = заяц.ИзвлечьУтку();  if (утка == null) goto exit;
    яйцо = утка.ИзвлечьЯйцо();  if (яйцо == null) goto exit;
    игла = яйцо.ИзвлечьИглу();  if (игла == null) goto exit;
}
exit:;
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #68 : Январь 15, 2013, 10:34:31 am »
Это усугубляет положение - goto еще более общая конструкция чем break.  и у него точно также как и у break нет никакой связи с if'ом (в отличие от пары exit when)
Только goto, только хардкор!
Ничего лишнего! Никаких break, никаких continue, никаких exit when!!!
Чем проще язык, тем легче сделать для него компилятор! (это же и есть главный девиз оберонов, не так ли?)
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #69 : Январь 15, 2013, 10:54:45 am »

Ничего лишнего! Никаких break, никаких continue, никаких exit when!!!

   :) А я то думал что второй вариант вам как функциональщику окажется ближе.. (т.е.  они предпочитают использовать
 сделать(опоределить) что-то, когда выполняется нечто...  нежели если выполняется нечто то делать что-то).

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #70 : Январь 15, 2013, 11:26:34 am »
Если в программе "мало ветвлений", то никакой практически пользы от графики не обнаружится.
Как только становится "много ветвлений" (какая-нибудь логика на верхнем уровне бизнес-приложения, или логика в системах управления типа вот таких циклов - они там любят быть как раз, в СУ) - начинает проявляться польза - и, мне кажется, я достаточно много попытался объяснить, почему, с примерами.
Боюсь, что НЕТ (я имею ввиду рядового программиста -не архитектора, или управляющего,  также НЕ имеются ввиду. разводчики плат....)).

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #71 : Январь 15, 2013, 01:46:20 pm »
Ада:


Ну и продублирую, а то мало ли что там с картинкой случится:
-- найти первый комплект без иглы
for i in сундуки'Range loop
    заяц := ЗАЯЦ(сундуки(i));
    exit when заяц = null;
    утка := УТКА(заяц);
    exit when утка = null;
    яйцо := ЯЙЦО(утка);
    exit when яйцо = null;
    игла := ИГЛА(яйцо);
    exit when игла = null;
end loop;
Еще одно подтверждение тезиса про легион.
Вы поймите, что все разработчики языков шизанулись на выходе из цикла.
В таких конструкциях получается, что для продолжения цикла нужна истина в в заголовке цикла и ложь в условия выхода (exit when). Вот это несовпадение логических знаков и портит всю малину.
Но только тем, у кого есть что портить.
Остальным - пох...

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Выход из цикла или смерть Кощея
« Ответ #72 : Январь 15, 2013, 01:48:05 pm »
А еще можно эти процедуры в массив запихать. И спускаться по этому массиву... (можно рекурсивно)

Типа так (если ничего не напутал):
func_array = {get_rabbit, get_duck, get_egg, get_needle}
result_array = {}

i = 0
box_count = #box_array
max_level = #func_array
while i < box_count and not result_array[max_level] do
    i = i + 1
    j = 0
    last = box_array[i]
    repeat
        j = j + 1
        current_func = func_array[j]
        last = current_func(last)
        result_array[j] = last
    until j == max_level or not last
end

if result_array[max_level] then
    print(i)
end

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #73 : Январь 15, 2013, 01:54:22 pm »


Еще одно подтверждение тезиса про легион.
Вы поймите, что все разработчики языков шизанулись на выходе из цикла.
В таких конструкциях получается, что для продолжения цикла нужна истина в в заголовке цикла и ложь в условия выхода (exit when). Вот это несовпадение логических знаков и портит всю малину.
Но только тем, у кого есть что портить.
Остальным - пох...
Ниче не понял... наоборот  в условии выхода (exit when заяц=null) должна быть истина.. разве нет?

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #74 : Январь 15, 2013, 02:01:49 pm »
Вы не воспринимаете графическую форму в принципе
Графическую форму я воспринимаю.
Вот доказательство http://oberspace.dyndns.org/index.php/topic,172.msg2841.html#msg2841 :)