Автор Тема: Oberon-07/13: заметки  (Прочитано 83822 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Oberon-07/13: заметки
« Ответ #90 : Июнь 27, 2014, 05:47:36 pm »
vlad, скажем так, профессиональное чутье не позволяет мне доверять такому решению. Если уж в WITH дырка обнаружилась..., то тут я бы крепко подумал перед тем как этим пользоваться.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #91 : Июнь 27, 2014, 05:50:32 pm »
Должно бы быть да, но нет. Похоже баг. Следующее успешно компилится. Но ясно что это не правильно.

Да, это баг. Сабмитни плиз? :)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #92 : Июнь 27, 2014, 05:53:27 pm »
vlad, скажем так, профессиональное чутье не позволяет мне доверять такому решению. Если уж в WITH дырка обнаружилась..., то тут я бы крепко подумал перед тем как этим пользоваться.
А тут точно дырки не будет :-) Ибо типобезопасно. И проверено в других ЯП.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #93 : Июнь 27, 2014, 05:55:36 pm »
Должно бы быть да, но нет. Похоже баг. Следующее успешно компилится. Но ясно что это не правильно.

Да, это баг. Сабмитни плиз? :)
https://github.com/vladfolts/oberonjs/issues/48
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Oberon-07/13: заметки
« Ответ #94 : Июнь 27, 2014, 05:56:13 pm »
2 valexey_u
Эмм.. в каких? Не Милнер же тут.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #95 : Июнь 27, 2014, 05:56:53 pm »
2 valexey_u
Эмм.. в каких? Не Милнер же тут.

Дык Влад же писал - в Kotlin подобное решение есть.

Ты учти, что по факту тут, внутри этого IF-блока создается локальная переменная с тем же именем что и проверенная, но с другим типом, которая полностью затеняет старую переменную. При этом старая может быть объявлена только вне VAR-секции (иначе могли бы быть проблемы со вложенными процедурами). Поэтому протечь тут просто нечему. Всё герметично! :-)
« Последнее редактирование: Июнь 27, 2014, 05:58:39 pm от valexey_u »
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Oberon-07/13: заметки
« Ответ #96 : Июнь 27, 2014, 05:59:48 pm »
Дико извиняюсь. Не читаю я все.  ::)

Я бы и в код мог посмотреть, но больно тошнотворен жабаскрипт для моего нежного мозга.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #97 : Июнь 27, 2014, 06:02:46 pm »
Дико извиняюсь. Не читаю я все.  ::)

Я бы и в код мог посмотреть, но больно тошнотворен жабаскрипт для моего нежного мозга.

Ну, вообще то там уже немалая часть на Обероне/Ебероне переписана. То есть львиная часть компилятора уже на нем самом :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #98 : Июнь 27, 2014, 06:04:33 pm »
Дико извиняюсь. Не читаю я все.  ::)

Я бы и в код мог посмотреть, но больно тошнотворен жабаскрипт для моего нежного мозга.

Не, не смотри - я все-таки надеюсь этот кусок на обероне переписать. Ну и от однопроходности избавиться.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #99 : Июнь 27, 2014, 06:18:11 pm »
См. выше - бага!

И бага там -- у тебя )))

    Derived = RECORD (Base) derivedField: INTEGER END;
    PDerived = POINTER TO Derived;

    Derived2 = RECORD (Base) derivedField: REAL END;
    PDerived2 = POINTER TO Derived;

то есть PDerived и PDerived2 -- один и тот же тип )))
to iterate is human, to recurse, divine

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #100 : Июнь 27, 2014, 06:21:17 pm »
Вот ещё интересный вариант:
MODULE T;
TYPE
    Base      = RECORD END;
    PBase     = POINTER TO Base;

    Derived1  = RECORD (Base) derivedField: INTEGER END;
    PDerived1 = POINTER TO Derived1;

    Derived2  = RECORD (Base) derivedField: REAL    END;
    PDerived2 = POINTER TO Derived2;

VAR
pbVar: PBase;
BEGIN
pb <- pbVar;
    IF (pb IS PDerived1) OR (pb IS PDerived2) THEN
        pb.derivedField := 123;
    END;
END T.
каким будет тип поля derivedField -- целым или вещественным?
to iterate is human, to recurse, divine

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #101 : Июнь 27, 2014, 06:27:26 pm »
Ты учти, что по факту тут, внутри этого IF-блока создается локальная переменная с тем же именем что и проверенная, но с другим типом, которая полностью затеняет старую переменную. При этом старая может быть объявлена только вне VAR-секции (иначе могли бы быть проблемы со вложенными процедурами). Поэтому протечь тут просто нечему. Всё герметично! :-)

чота не заметно:
    pb <- pbVar;
    IF (pb IS PDerived1) THEN
        pb.derivedField := 123;
    END;
var pbVar = null;
var pb = pbVar;
if (pb instanceof Derived){
    pb.derivedField = 123;
}
to iterate is human, to recurse, divine

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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #102 : Июнь 27, 2014, 06:28:19 pm »
каким будет тип поля derivedField -- целым или вещественным?

Ну этот вариант вообще из другой оперы - в шаблоны и прочая обобщенка.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Oberon-07/13: заметки
« Ответ #103 : Июнь 27, 2014, 06:29:14 pm »
Цитировать
invalid type test: a value variable cannot be used

vlad, ты тут как бы намекаешь, что плюшка только для POINTER?
Кроме того похоже что вообще IS нельзя с RECORD использовать. Это что за прикол?

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #104 : Июнь 27, 2014, 06:33:05 pm »
Всё герметично! :-)
чота не заметно:

Результирующий код должен быть эффективным ;) На герметичность не влияет.

P.S. Копий никаких не делается - они просто не нужны. Отсутствие "фатальных" модификаций "проапгрейченной" переменной гарантируется тем, что она недоступна для вложенных процедур .