Автор Тема: Чем Вирту WITH не угодил?  (Прочитано 85770 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Чем Вирту WITH не угодил?
« : Апрель 26, 2012, 10:32:09 am »
http://www.inf.ethz.ch/personal/wirth/Articles/Oberon/Oberon07.pdf
Цитировать
The With statement has been eliminated.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #1 : Апрель 26, 2012, 10:38:13 am »
Я конечно понимаю, что одноветочный WITH из оригинального Оберона мало полезен. Но ведь можно было многоветочный из Oberon 2 взять

Vartovyj

  • Full Member
  • ***
  • Сообщений: 197
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #2 : Апрель 26, 2012, 10:42:34 am »
Цитировать
The With statement has been eliminated.
Стремление к упрощению. Я бы упростил до WHILE DO и DO WHILE или, вообще до расширенного универсального FOR.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #3 : Апрель 26, 2012, 10:46:11 am »
А при чем тут циклы?

Vartovyj

  • Full Member
  • ***
  • Сообщений: 197
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #4 : Апрель 26, 2012, 11:07:36 am »
А при чем тут циклы?
Я к тому, что для упрощения можно оставить только WHILE DO, DO WHILE, FOR, IF-THEN-ELSIF-ELSE.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #5 : Апрель 26, 2012, 11:13:50 am »
Т.е. сделать в них охрану типа? Мне думается что это сильно усложнит компилятор...

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #6 : Апрель 26, 2012, 11:30:25 am »
неуклюжая конструкция, хватает логического оператора is вместе с if ом - IF btn IS button THEN .....

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #7 : Апрель 26, 2012, 11:35:22 am »
Эээ нееее  :)

Проба типа не отменяет охрану типа  :)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #8 : Апрель 26, 2012, 11:36:56 am »
Вот кстати многоветочный WITH объединяет в себе и пробу и охрану.  ;)

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #9 : Апрель 26, 2012, 11:45:19 am »
Эээ нееее  :)

Проба типа не отменяет охрану типа  :)
Я не говорю, что отменяет, я говорю что хватает...

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #10 : Апрель 26, 2012, 11:47:00 am »
Вот хороший пример для обсуждения (из книги "Проект Оберон"):

PROCEDURE Handle (F: Display.Frame; VAR M: Display.FrameMsg);
    VAR F1: Frame;
    BEGIN
      WITH F: Frame DO
        IF M IS Oberon.InputMsg THEN
           WITH M: Oberon.InputMsg DO
             IF M.id = Oberon.track THEN Edit(F, M.X, M.Y, M.keys)
              ELSIF M.id = Oberon.consume THEN
               IF F.car # 0 THEN Write(F, M.ch, M.fnt, M.col, M.voff) END
              END
           END
        ELSIF M IS Oberon.ControlMsg THEN
           WITH M: Oberon.ControlMsg DO 92
             IF M.id = Oberon.defocus THEN Defocus(F)
             ELSIF M.id = Oberon.neutralize THEN Neutralize(F)
             END
           END
        ELSIF M IS Oberon.SelectionMsg THEN
           WITH M: Oberon.SelectionMsg DO GetSelection(F, M.text, M.beg, M.end, M.time) END
        ELSIF M IS Oberon.CopyOverMsg THEN
           WITH M: Oberon.CopyOverMsg DO CopyOver(F, M.text, M.beg, M.end) END
        ELSIF M IS Oberon.CopyMsg THEN
           WITH M: Oberon.CopyMsg DO Copy(F, F1); M.F := F1 END
        ELSIF M IS MenuViewers.ModifyMsg THEN
           WITH M: MenuViewers.ModifyMsg DO Modify(F, M.id, M.dY, M.Y, M.H) END
        ELSIF M IS UpdateMsg THEN
           WITH M: UpdateMsg DO
             IF F.text = M.text THEN Update(F, M) END
           END
        END
      END
END Handle;

Тут приходится делать и пробу и охрану.

В Обероне 07 вместо:
WITH M: Oberon.CopyOverMsg DO CopyOver(F, M.text, M.beg, M.end) ENDбудет:
M(Oberon.CopyOverMsg).CopyOver(F, M.text, M.beg, M.end)
А в Обероне 2 весь ELSIF IS WITH заменится на один многоветочный WITH.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #11 : Апрель 26, 2012, 11:50:20 am »
Я не говорю, что отменяет, я говорю что хватает...

Это как посмотреть. Некоторые ошибки в рантайм пролезут

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #12 : Апрель 26, 2012, 12:00:25 pm »
Чет я не так выразился... В рантайм они и с WITH пролезут, но по оному будут локализованы в точке охраны типа. А без WITH... я даже не знаю, что произойдет  :D

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #13 : Апрель 26, 2012, 12:03:01 pm »
Естественно... должно быть кастование  типа as (WITH это комбинация is и as растянутая на некоторую последовательность действий...)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #14 : Апрель 26, 2012, 12:04:26 pm »
В Обероне 07 вместо:
WITH M: Oberon.CopyOverMsg DO CopyOver(F, M.text, M.beg, M.end) ENDбудет:
M(Oberon.CopyOverMsg).CopyOver(F, M.text, M.beg, M.end)

Фу ты черт хрень написал  :(
В Обероне 07 так будет:
CopyOver(F, M(Oberon.CopyOverMsg).text, M(Oberon.CopyOverMsg).beg, M(Oberon.CopyOverMsg).end)