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

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #90 : Апрель 28, 2012, 09:48:04 am »
 :( Вот... поползли контрпримеры...  на этом пример... можно сказать - давайте задекларируем  создание локальной копии любой охраняемой переменной (не только указателя).... в свою очередь всегда можно привести пример такой записи, что создание  локальной копии ее будет неприемлемо из чисто практических соображений... другой выход.. разрешить  WITH  только с указателями...

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #91 : Апрель 28, 2012, 09:50:19 am »
...сделать так как предлагает Влад - то это будет немного другой язык...
Полностью согласен.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #92 : Апрель 28, 2012, 09:50:46 am »
Хотя конечно это дело можно развить и обобщить до внутренних блоков внутри функции со своими локальными переменными, часть которых являются производными от переменных основной функции после прохождения проверки на предусловие (по типу, значениям). По сути это дело отличается семантически от обычной вложенной функции только невозможностью рекурсии (то есть по умолчанию компилятор может спокойно это дело всегда инлайнить).

Но, по моему, я только что изобрел паттерн-матчинг в обероне :-)

Я кажется понял почему Вирт это дело выпилил - удобств особых это не добавляет, а язык сильно усложняет и запутывает. А поскольку WITH в Обероне никоем образом не похож на CASE, то даже обработку/разбор сообщений (в Message Bus) оно совсем не облегчает, соответственно Вирт просто избавился от бесполезного и не безопасного излишества.
« Последнее редактирование: Апрель 28, 2012, 09:53:00 am от valexey »
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #93 : Апрель 28, 2012, 09:59:11 am »
WITH p1: derived_p1: Derived1 DO

Где derived_p1 - локальная переменная с типом Derived1. С типом оригинальной переменной p1 ничего не происходит.

Да, кстати. Уточню свою позицию:
Я думаю синтаксис WITH можно оставить как есть, а копию должен делать компилятор. Т.е. это должно быть скрыто от программиста. Для него это тот же самый указатель.

В синтаксисе мне нравится предложение DIzer'а

ilovb

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

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #95 : Апрель 28, 2012, 10:22:05 am »
как как... каст при каждом использовании ... аналог Дельфийского (TControl as Tbutton).visible:=true

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #96 : Апрель 28, 2012, 10:26:21 am »
точнее аналог следующий  if ctrl is TButton then begin ...  (ctrl  as TButton) .visible:=true;....   end;

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #97 : Апрель 28, 2012, 10:29:38 am »
Неудобно ведь... Впрочем это ИМХО...

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #98 : Апрель 28, 2012, 10:31:13 am »
Неудобно ведь... Впрочем это ИМХО...
Тык вся философия Оберонов, в том, что не удобствах счастье... ;) :D ;D и Вирт  следует ей бескомпромиссно и безжалостно к  программисту...
« Последнее редактирование: Апрель 28, 2012, 10:33:19 am от DIzer »

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #99 : Апрель 28, 2012, 10:35:03 am »
 гораздо более у него сочувствия к компилятороклепалам... (с чего бы это?)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #100 : Апрель 28, 2012, 02:42:28 pm »
Как понимаешь, никаких указателей тут не фигурирует.

Ну так и будет, если не указатель, то ссылка.
PROCEDURE Foo(VAR x : R0);
BEGIN
    WITH x VAR r1: R1 DO
        r1.foo := 42;
    END
END Foo

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #101 : Апрель 28, 2012, 02:48:02 pm »
Как понимаешь, никаких указателей тут не фигурирует.

Ну так и будет, если не указатель, то ссылка.
PROCEDURE Foo(VAR x : R0);
BEGIN
    WITH x VAR r1: R1 DO
        r1.foo := 42;
    END
END Foo

А зачем такие сложности? Тогда уж сразу разрешить делать так:
PROCEDURE A(VAR x : R1);
BEGIN
    x.foo := 42
END A

PROCEDURE B(VAR x : R0);
    PROCEDURE BA(VAR x : R1); BEGIN x.foo = 24 END BA
BEGIN
    A(x)
    BA(x)
END B

PROCEDURE C;
VAR
    x : R1;
BEGIN
    B(x)
END C
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #102 : Апрель 28, 2012, 03:07:17 pm »
А зачем такие сложности? Тогда уж сразу разрешить делать так:

Не, просто через процедуры неприкольно. Ошибок компиляции будет меньше, а багов больше ;)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #103 : Апрель 28, 2012, 03:24:25 pm »
А зачем такие сложности? Тогда уж сразу разрешить делать так:

Не, просто через процедуры неприкольно. Ошибок компиляции будет меньше, а багов больше ;)
Кстати, все таки украдено до нас. Go:
switch i := x.(type) {
case nil:
printString("x is nil")
case int:
printInt(i)  // i is an int
case float64:
printFloat64(i)  // i is a float64
case func(int) float64:
printFunction(i)  // i is a function
case bool, string:
printString("type is bool or string")  // i is an interface{}
default:
printString("don't know the type")
}
Таким образом у них switch может и типы перебирать и значения:
switch tag {
default: s3()
case 0, 1, 2, 3: s1()
case 4, 5, 6, 7: s2()
}
Одна конструкция вместо двух и отсутствие дырки которая была в Оберонах начиная с самого первого Оберона.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #104 : Апрель 28, 2012, 04:51:10 pm »
Круто! Прям по методу vlad'а