Автор Тема: ANDIF aka and then  (Прочитано 6990 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
ANDIF aka and then
« : Июнь 29, 2014, 02:34:25 pm »
Есть такая плюшка в аде (в выражениях). Еще была тема на oberoncore (искать лень), где Илья Ермаков возжелал такой механизьм для последовательности действий.

В обсчем я тут покодил на Go, прочуйствовал обработку ошибок, и задался вопросом:
А что мешает добавить ANDIF по аналогии с ELSIF?

IF cond1 THEN

ANDIF cond2 THEN

ANDIF cond3 THEN

ELSIF cond4 THEN

ANDIF cond5 THEN

ELSE

END;

ветка ANDIF выполняется тогда и только тогда, когда истинно условие предыдущей ветки (IF, ANDIF или ELSIF)

Структурно это замена вложенного IF:

IF cond1 THEN

  IF cond2 THEN (* это ANDIF *)
   
    IF cond3 THEN (* еще ANDIF *)

    END;
  END;
ELSE

  IF cond4 THEN (* это ELSIF *)
    IF cond6 THEN (* следующий ANDIF *)

    END;
  ELSE 
    IF cond5 THEN (* еще ELSIF *)

    END;
  END;
END;

Этот код транслируется в:

IF cond1 THEN

ANDIF cond2 THEN
   
ANDIF cond3 THEN

ELSEIF cond4 THEN

ANDIF cond6 THEN
 
ELSIF cond5 THEN

END;

Мне кажется, что это совершенно естественный сахарок как и ELSIF. Какие тут могут быть проблемы? (Укажите если кто видит)

С другой стороны можно сделать более явную конструкцию:

CHAIN cond1 :

| cond2 :

| cond3 :

END;

Смысл в том, что цепочка прерывается, как только не выполнится очередное условие.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: ANDIF aka and then
« Ответ #1 : Июнь 29, 2014, 03:14:24 pm »
Ты просто хочешь монады, но сам того не осознаешь :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: ANDIF aka and then
« Ответ #2 : Июнь 29, 2014, 07:48:19 pm »
Мне кажется, что это совершенно естественный сахарок как и ELSIF. Какие тут могут быть проблемы? (Укажите если кто видит)
1. В последовательности эндифов легко пропустить элсиф, поэтому читаемый код будет понят неправильно.

2. Эндиф - это не просто вложенный иф, а вложенный иф, который находится в самом конце  внешнего ифа. То есть, это частный случай, который совместно с первым пунктом кажется не особо полезным.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: ANDIF aka and then
« Ответ #3 : Июнь 29, 2014, 08:07:47 pm »
1. Вот потому и спрашиваю мнения со стороны. У меня тоже есть подозрения что можно будет пропустить чего...
2. Как раз этот частный случай и нужен на практике.

Например когда выполняешь некие функции, возвращающие код ошибки.

Есть только два варианта:
1.
err := F1();
IF ~err THEN
err := F2();
  IF ~err THEN
    err := F3();
      IF ~err THEN
        F4();
      END;
  END;
END;
При длинной цепочке это превращается в адЪ

Можно делать иначе:
err := F1();
IF ~err THEN
  err := F2();
END;
IF ~err THEN
  err := F3();
END;
IF ~err THEN
  F4();
END;

Так гораздо лучше, но коробит от лишних проверок.

А вот как это будет с ANDIF:

err := F1();
IF ~err THEN
  err := F2();
ANDIF ~err THEN
  err := F3();
ANDIF ~err THEN
  F4();
END;

Линейный код без лишних проверок. И шаблон цепочки явно выражен с помощью ключевого слова ANDIF.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: ANDIF aka and then
« Ответ #4 : Июнь 29, 2014, 08:09:36 pm »
А еще у меня была мысль делать отступы для ANDIF:

IF cond1 THEN

  ANDIF cond2 THEN
   
  ANDIF cond3 THEN

ELSEIF cond4 THEN

  ANDIF cond6 THEN
 
ELSIF cond5 THEN

END;

Так вроде невозможно запутаться.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: ANDIF aka and then
« Ответ #5 : Июнь 29, 2014, 08:14:27 pm »
Хотя нет. С отступами плохая идея.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: ANDIF aka and then
« Ответ #6 : Июнь 29, 2014, 08:18:07 pm »
Почему плохая?

Эндиф как замена вложенному ифу для конца внешнего ифа хороша до тех пор, пока не появляются ещё и ифы в середине внешнего ифа.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: ANDIF aka and then
« Ответ #7 : Июнь 29, 2014, 08:22:47 pm »
Плоха т.к. с толку будет сбивать. Пусть лучше на своем уровне.

Про "ифы в середине внешнего ифа" не понял. Можно пример?

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: ANDIF aka and then
« Ответ #8 : Июнь 29, 2014, 08:27:45 pm »
IF e1 THEN
   v1 := F1();
   IF P(v1) THEN
      v2 := F2()
   END;
   v3 := F3(v1, v2)
ANDIF
   Fx()
END;

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: ANDIF aka and then
« Ответ #9 : Июнь 29, 2014, 08:33:33 pm »
Ну и все прекрасно же.

IF e1 THEN (* первое звено *)
   v1 := F1();
   IF P(v1) THEN
      v2 := F2()
   END;
   v3 := F3(v1, v2)
ANDIF e2 THEN (* второе звено *)
   Fx()
END;

В том и соль, что там где нет ANDIF там и цепочки нет

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: ANDIF aka and then
« Ответ #10 : Июнь 29, 2014, 09:59:48 pm »
А вот как это будет с ANDIF:

err := F1();
IF ~err THEN
  err := F2();
ANDIF ~err THEN
  err := F3();
ANDIF ~err THEN
  F4();
END;

Линейный код без лишних проверок. И шаблон цепочки явно выражен с помощью ключевого слова ANDIF.

Плохой вариант имхо.
В операторе IF-ELSIF все условия вычисляются сразу до тех пор пока хоть одно из них не даст TRUE, и только потом идёт выполнение одного из блоков этого оператора, и на этом оператор IF заканчивает своё выполнение.
В Вашем же варианте после выполнения одного из блоков могут начать вычисляться другие условия того же оператора IF.
Думаю, это слишком нестандартное изменение семантики давно известного оператора, не взлетит, как не взлетели всякие циклы-пауки, например...
to iterate is human, to recurse, divine

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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: ANDIF aka and then
« Ответ #11 : Июнь 29, 2014, 11:31:32 pm »
Да не меняется тут семантика. Это сахар.

IF cond1 THEN

ANDIF cond2 THEN

END;

Транслируется в:

IF cond1 THEN

  IF cond2 THEN

  END;
END;

Абсолютно ничего не меняется кроме способа записи. Ровно точно так же как ELSIF сахар для следующего:

IF cond1 THEN

ELSE
  IF cond2 THEN

  END;
END;

ANDIF - это ELSIF наоборот.

ps Но отрицательный отзыв принят :) Видимо отдельная конструкция будет более понятной.