OberonCore https://forum.oberoncore.ru/ |
|
Конструкция AND THEN? https://forum.oberoncore.ru/viewtopic.php?f=27&t=3175 |
Страница 1 из 2 |
Автор: | Илья Ермаков [ Среда, 19 Январь, 2011 00:05 ] |
Заголовок сообщения: | Конструкция AND THEN? |
После написания очередного кода взаимодействия с окружением, с кучей проверок - полуночная мыслишка о конструкции: Код: Первый_этап; IF первый этап удался THEN Второй_этап AND второй этап удался THEN Третий_этап AND третий этап удался THEN Завершающие действия ELSE Задача не выполнена END Пока условия истинны, выполнение продвигается. При первом ложном условии выполнение переключается на ELSE. В ряде задач нужно ещё различать, на каком этапе неуспех. Но это делается явной переменной, хранящей текущий этап. Код: step := 1;
Первый_этап; IF первый этап удался THEN step := 2; Второй этап; AND второй этап удался THEN ... ELSE Log.String("Ошибка на этапе "); Log.Int(step) END |
Автор: | Валерий Лаптев [ Среда, 19 Январь, 2011 00:20 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
А сейчас как это моделируется? Код: Первый этап; IF первый этап удался THEN Второй этап; END; IF второй этап удался THEN Третий этап; END; IF третий этап удался THEN Завершающие действия; ELSE Задача не выполнена; END; Да, AND THEN является неделимой конструкцией - это хорошо. Но не похоже ли это на if Дейкстры, который я приводил ранее в другой теме (viewtopic.php?p=57323#p57323)? |
Автор: | Илья Ермаков [ Среда, 19 Январь, 2011 00:27 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Валерий Лаптев писал(а): А сейчас как это моделируется? Нет, не так, как Вы привели. У Вас проверка "второй этап удался" не стоит под охраной "первый этап удался". Сейчас, если не громоздить вложенные IF-ы, обычно делаем: (обсуждалось тут: viewtopic.php?f=6&t=2290) Код: Первый этап; ok := первый этап удался; IF ok THEN Второй этап; ok := второй этап удался END; IF ok THEN Действия при успехе ELSE Действия при неуспехе END Т.е. переход состояния управления моделируется спец. переменной. То ли мы ещё на успешном маршруте, то ли уже нет. |
Автор: | alexus [ Среда, 19 Январь, 2011 06:02 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Что мешает сделать этапы логическими функциями? Тогда было бы просто... Код: IF <этап0> AND <этап1> AND <этап3> ... THEN.... или даже так: Код: i := 0;
WHILE ((i < Count) AND <зтап[i]>) DO BEGIN ... i := i + 1; END; ok := (i = Count); |
Автор: | Александр Ильин [ Среда, 19 Январь, 2011 06:56 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Можно ANDIF по аналогии с ELSIF. |
Автор: | Владислав Жаринов [ Среда, 19 Январь, 2011 08:18 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Илья Ермаков писал(а): ... А для скрытия этой переменной какие мотивы? Так получается удобнее писать? или читать?Сейчас, если не громоздить вложенные IF-ы, обычно делаем: Код: Первый этап; Т.е. переход состояния управления моделируется спец. переменной. То ли мы ещё на успешном маршруте, то ли уже нет.ok := первый этап удался; IF ok THEN Второй этап; ok := второй этап удался END; IF ok THEN Действия при успехе ELSE Действия при неуспехе END Я к тому, что можно записать логику выбора по-разному - см. этот пример хотя бы. Тут во втором варианте переменная состояния присутствует явно - а в первом неявно через "символизацию" адресов силуэтных БП (которые трактуются как коды состояния). А если совсем убрать - не лишится ли мышление читателя (особенно "предметника") существенной опоры для восприятия (особенно когда действительно имеются в виду состояния деятельности)? Можно, конечно, фиксировать это в комментариях... |
Автор: | Peter Almazov [ Среда, 19 Январь, 2011 08:37 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Илья Ермаков писал(а): Сейчас, если не громоздить вложенные IF-ы, обычно делаем: Вот так и дальше делайте.
|
Автор: | albobin [ Среда, 19 Январь, 2011 08:38 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Из своей практики (MUMPS) могу предложить: 1. Такой же как у И.Ермакова с переменной ok. 2. Каждый этап оформлен как функция, возвращающая успешность выполнения. Тогда получается что-то вроде (сама идея) : IF not этап1 ELSEIF not этап2 ... ELSEIF not этапN ELSE итоговые 3. WHILE в комбинации с CASE в теле WHILE (что то вроде наипростейшего автомата) P.S. А сама конструкция (начало темы) не очень нравится |
Автор: | Geniepro [ Среда, 19 Январь, 2011 08:55 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Илья Ермаков писал(а): После написания очередного кода взаимодействия с окружением, с кучей проверок - полуночная мыслишка о конструкции: Код: Первый_этап; IF первый этап удался THEN Второй_этап AND второй этап удался THEN Третий_этап AND третий этап удался THEN Завершающие действия ELSE Задача не выполнена END Пока условия истинны, выполнение продвигается. При первом ложном условии выполнение переключается на ELSE. Интересно, почему нет такой конструкции в распространённых языках. Наверное потому, что она легко имитируется использованием выхода из середины процедуры и генерацией/обработкой исключений. |
Автор: | Geniepro [ Среда, 19 Январь, 2011 08:56 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Peter Almazov писал(а): Илья Ермаков писал(а): Сейчас, если не громоздить вложенные IF-ы, обычно делаем: Вот так и дальше делайте.Любая ручная рутина провоцирует лишние ашипки. То, что может быть автоматизировано -- должно быть автоматизировано. |
Автор: | Евгений Темиргалеев [ Среда, 19 Январь, 2011 09:29 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Илья Ермаков писал(а): После написания очередного кода взаимодействия с окружением, с кучей проверок - полуночная мыслишка о конструкции: "Утро вечера мудренее". Стоит исчо подумать.
|
Автор: | Сергей Губанов [ Среда, 19 Январь, 2011 12:07 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Просто используйте вложенные IF и нечего огород городить. Кстати, большинство вложенных IF можно раскрутить в линейную цепочку с использованием ELSIF если сначала проверять "противное" условие. |
Автор: | Александр Ильин [ Среда, 19 Январь, 2011 13:05 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Сергей Губанов писал(а): Кстати, большинство вложенных IF можно раскрутить в линейную цепочку с использованием ELSIF если сначала проверять "противное" условие. О! Спасибо за подсказку!Пример: Код: IF A THEN Превращаем в:IF B THEN a; ELSE b; END; ELSE c; END; Код: IF ~A THEN Жаль, что не получится между проверкой A и проверкой B вставить какое-то действие, например, присваивание. Например, если B = (item = NIL), и item можно присвоить только если A = TRUE:c; ELSIF ~B THEN b; ELSE a; END; Код: IF list # NIL THEN Не преобразуется.item := list.first; IF item # NIL THEN a; ELSE b; END; ELSE c; END; Разве что завести процедуру GetItem (list: List; VAR res: Item): BOOLEAN, но это редко стоит выигранного отступа. |
Автор: | bohdant [ Среда, 19 Январь, 2011 14:15 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Илья, а почему не сделать просто: Код: PROCEDURE ПервыйЭтап(VAR step:LONGINT):BOOLEAN;
BEGIN INC(step) END ПервыйЭтап; step := 0; IF ПервыйЭтап(step) AND ВторойЭтап(step) AND Трет..... THEN Завершающие действия ELSE Log.String("Ошибка на этапе "); Log.Int(step) END |
Автор: | Евгений Темиргалеев [ Среда, 19 Январь, 2011 14:25 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Александр Ильин писал(а): Сергей Губанов писал(а): Кстати, большинство вложенных IF можно раскрутить в линейную цепочку с использованием ELSIF если сначала проверять "противное" условие. О! Спасибо за подсказку! |
Автор: | Alexey Veselovsky [ Среда, 19 Январь, 2011 16:56 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Илья Ермаков писал(а): После написания очередного кода взаимодействия с окружением, с кучей проверок - полуночная мыслишка о конструкции: В общем вот для С++: http://valexey.blogspot.com/2011/01/and-then-in-c.html Язык менять не надо. Макросы не нужны. Шаблоны не нужны. Перегрузка операторов не нужна. |
Автор: | Geniepro [ Среда, 19 Январь, 2011 18:41 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
albobin писал(а): 2. Каждый этап оформлен как функция, возвращающая успешность выполнения. Тогда получается что-то вроде (сама идея) : IF not этап1 ELSEIF not этап2 ... ELSEIF not этапN ELSE итоговые Не всегда эти этапы стоит оформлять как функции. Часто этап занимает 2-3 строки -- и что, эти 2-3 строки выдирать из контекста, добавлять ещё три строки на PROCEDURE ... BEGIN ... END, протаскивать туда нужный этапу конекст? Стоит ли? |
Автор: | alexus [ Среда, 19 Январь, 2011 20:19 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Надо расширить постановку задачи... Не только AND THEN, но и OR THEN, XOR THEN, NOT THEN... Ну, а дальше простор для фантазии... Например, EQ1 THEN, EQ2 THEN, EB0 THEN, EA1 THEN... Потом подумать про обобщающие конструкции... PS. "Сон разума рождает чудовищ" Гете. |
Автор: | Илья Ермаков [ Среда, 19 Январь, 2011 20:42 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
albobin писал(а): Из своей практики (MUMPS) могу предложить: 1. Такой же как у И.Ермакова с переменной ok. 2. Каждый этап оформлен как функция, возвращающая успешность выполнения. Тогда получается что-то вроде (сама идея) : IF not этап1 ELSEIF not этап2 ... ELSEIF not этапN ELSE итоговые 3. WHILE в комбинации с CASE в теле WHILE (что то вроде наипростейшего автомата) P.S. А сама конструкция (начало темы) не очень нравится Да, мне представляется хорошим вот такой вариант: Код: step := 1; ok := TRUE; WHILE (step # 3) & ok DO CASE step OF | 1: Первый этап; ok := первый этап успешен | 2: Второй этап; ok := второй этап успешен END; INC(step) END С функциями не нравится, т.к. теряется общий вид на последовательность. Характер таких алгоритмов (последовательность шагов-проверок) как раз такой, что лучше иметь линейную простыню, чем рвать на части. Использование переменных сквозное и т.п. Ну, расширять язык я, разумеется, и не предлагал. Конструкция была затравкой к рассмотрению такого класса алг. структур |
Автор: | albobin [ Среда, 19 Январь, 2011 20:55 ] |
Заголовок сообщения: | Re: Конструкция AND THEN? |
Чем не очень нравится конструкция с AND THEN, так тем (по мимо всего прочего), что она не эквивалентна последовательности IFов: IF лог.выражение1 THEN действие 1 END IF лог.выражение1 AND лог.выражение2 THEN действие 2 END и т.д. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |