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

vlad

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

Работает, если есть гарантия (вычисленная булевой алгеброй), что тип правильный. Ты хотел что-то другого? Для негарантийных случаев есть обычное приведение типа - не угадал - получил АВОСТ.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Oberon-07/13: заметки
« Ответ #76 : Июнь 27, 2014, 05:12:18 pm »
Какой именно идее оно противоречит? С точки зрения математики там все чисто и просто - доказывается истинность/ложность/непределенность выражения при заданном типе и любых других аргументах.

Очевидно, что есть более простое решение. И оно давно известно (WITH).
Простота достигается с помощью разделения и специализации. (Разделяй и властвуй)
У тебя же с точностью наоборот. Попытка впихнуть невпихуемое.

А на счет простоты математики не понял. Выражение может быть сколь угодно сложным. Значит ты либо должен сделать полный вывод и компиляцию раскладов (не представляю возможно ли такое), либо врубать неопределенность при первом шухере..., но в чем тогда смысл? По сравнению с WITH это похоже на использование скотча.

Не холивора ради. Я реально ошарашен таким решением в Обероне. В чем либо Си-подобном еще куда ни шло. Там все так сделано. Но в Обероне это нонсенс.

С другой стороны было бы круто иметь полный вывод (я и сам о таком мечтаю), но если я правильно понял, то его нет в данном случае.

Не исключаю, что я просто не вижу простоты решения.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #77 : Июнь 27, 2014, 05:13:21 pm »
Очевидно, что есть более простое решение. И оно давно известно (WITH).

В Обероне его нету, увы. Вирт выпилил. Возможно он собирается его вернуть под другим соусом, но ещё не вернул.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Oberon-07/13: заметки
« Ответ #78 : Июнь 27, 2014, 05:18:12 pm »
Ну таки есть разница между "выкинуть" и "вкрутить более сложное" не так ли?  :)

valexey_u

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

Очевидно, что есть более простое решение. И оно давно известно (WITH).
Простота достигается с помощью разделения и специализации. (Разделяй и властвуй)
У тебя же с точностью наоборот. Попытка впихнуть невпихуемое.

А на счет простоты математики не понял. Выражение может быть сколь угодно сложным. Значит ты либо должен сделать полный вывод и компиляцию раскладов (не представляю возможно ли такое), либо врубать неопределенность при первом шухере..., но в чем тогда смысл? По сравнению с WITH это похоже на использование скотча.

Не холивора ради. Я реально ошарашен таким решением в Обероне. В чем либо Си-подобном еще куда ни шло. Там все так сделано. Но в Обероне это нонсенс.

А ты попробуй поиграться. Компилятор просто тебе по рукам даст, если нет гарантированной проверки типа в твоем условии. На рантайм ничего не возлагается. То есть не бывает такого, что вот ты написал условие, и в некоторых случаях во время работы приложения условие там проверилось, а в некоторых нет. Проверится или нет - известно на этапе компиляции. Если есть шанс что не проверится - переписывай условие, или другими способами вставляй защиту.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #81 : Июнь 27, 2014, 05:26:58 pm »
Оно уже онлайн?
Да, конечно. Влад же написал.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Oberon-07/13: заметки
« Ответ #82 : Июнь 27, 2014, 05:33:57 pm »
Еще вопросик. Давно хочу сей компилер в Sublime играть. Есть инструкция как прикрутить для нубов?

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #83 : Июнь 27, 2014, 05:35:15 pm »
Чет я не очень понимаю как ты смог пункт 2 реализовать.
Как ты разруливаешь такие ситуации?:
IF (pb IS PDerived)  OR Other THEN
        pb.derivedField := 123;
END;

Очень легко - там работает только если там нет альтернативной ветки в условии:

    IF (pb IS PDerived) & b THEN (* работает*)
        pb.derivedField := 123;
    END;

    IF (pb IS PDerived) OR b THEN
        pb.derivedField := 123; (* ошибка компиляции: line 13: type 'Base' has no 'derivedField' field *)
    END;

Интересно, как быть в таком случае:
    IF (pb IS PDerived1) OR (pb IS PDerived2) THEN
        pb.derivedField := 123;
    END;
тоже ошибка "type 'Base' has no 'derivedField' field"?
to iterate is human, to recurse, divine

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

ilovb

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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #85 : Июнь 27, 2014, 05:37:52 pm »
Очевидно, что есть более простое решение. И оно давно известно (WITH).

У WITH есть 2 фатальных недостатка. И второй неоднократно осуждали - возможность порушить пресловутую герметичность типов. Можно допиливать, накладывая всякие ограничения (и усложнения, хе-хе!). Но мне захотелось чего-то еще лучшего и естественного (IF намного менее громоздко, нежели WITH, не говоря о просто выражениях а-ля "(x IS T) & x.field"). Кроме того, в моем решении есть прицел на ненулевые указатели и OPTIONAL типы - для которых такой подход также единообразно будет работать.

Простота достигается с помощью разделения и специализации. (Разделяй и властвуй)
У тебя же с точностью наоборот. Попытка впихнуть невпихуемое.

Не понял - еще раз, где мое решение не просто? Оно даже в коде реализации достаточно простое. А при использовании так вообще - максимально естественно - проверил тип, получил к нему доступ.

А на счет простоты математики не понял. Выражение может быть сколь угодно сложным.

Оно может быть сколь угодно сложным, но для получения результата достаточно выбросить все, кроме IS, &, OR, ~. После этого все получается просто :) Представь, что ты проверяешь тип в сложном выражении и потом кастаешь его - на свой страх и риск, а тут у тебя компилятор гарантирует, что все правильно, да еще и кастать не надо! Счастье же ш и расслабон!

Значит ты либо должен сделать полный вывод и компиляцию раскладов (не представляю возможно ли такое), либо врубать неопределенность при первом шухере..., но в чем тогда смысл? По сравнению с WITH это похоже на использование скотча.

Попробуй придумать выражение, вывод которого очевиден программисту, но на котором будет тупить компилятор? Может я правда что-то упустил.

P.S. Конечно это не хаскель :) Решение очень простое - поэтому мне и странно противопоставление идеям оберона.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #86 : Июнь 27, 2014, 05:40:39 pm »
Не понял шутку юмора. Так значит таки не работает? O_o

Работает, если есть гарантия (вычисленная булевой алгеброй), что тип правильный. Ты хотел что-то другого? Для негарантийных случаев есть обычное приведение типа - не угадал - получил АВОСТ.

Ну круто, чо. Хотя не понятно, чем это лучше чем WITH?
to iterate is human, to recurse, divine

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #87 : Июнь 27, 2014, 05:42:37 pm »
Чет я не очень понимаю как ты смог пункт 2 реализовать.
Как ты разруливаешь такие ситуации?:
IF (pb IS PDerived)  OR Other THEN
        pb.derivedField := 123;
END;

Очень легко - там работает только если там нет альтернативной ветки в условии:

    IF (pb IS PDerived) & b THEN (* работает*)
        pb.derivedField := 123;
    END;

    IF (pb IS PDerived) OR b THEN
        pb.derivedField := 123; (* ошибка компиляции: line 13: type 'Base' has no 'derivedField' field *)
    END;

Интересно, как быть в таком случае:
    IF (pb IS PDerived1) OR (pb IS PDerived2) THEN
        pb.derivedField := 123;
    END;
тоже ошибка "type 'Base' has no 'derivedField' field"?

Должно бы быть да, но нет. Похоже баг. Следующее успешно компилится. Но ясно что это не правильно.
MODULE T;
TYPE
    Base = RECORD END;
    PBase = POINTER TO Base;
    Derived = RECORD (Base) derivedField: INTEGER END;
    PDerived = POINTER TO Derived;

    Derived2 = RECORD (Base) derivedField2: INTEGER END;
    PDerived2 = POINTER TO Derived;

VAR
pbVar: PBase;
BEGIN
pb <- pbVar;
    IF (pb IS PDerived) OR (pb IS PDerived2) THEN
        pb.derivedField := 123;
    END;
END T.
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #88 : Июнь 27, 2014, 05:44:53 pm »
О, Geniepro, спасибо. Интересный вопрос.

Да, это интересный случай - приведения к общей базе для Derived1 и Derived2 не будет. Придется написать "IF pb IS PCommonBase" - что, замечу, лучше отражает суть происходящего и лучше читается.

P.S. "Ага!" - сказали суровые сибирские мужики ;)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #89 : Июнь 27, 2014, 05:47:09 pm »
О, Geniepro, спасибо. Интересный вопрос.

Да, это интересный случай - приведения к общей базе для Derived1 и Derived2 не будет. Придется написать "IF pb IS PCommonBase" - что, замечу, лучше отражает суть происходящего и лучше читается.

P.S. "Ага!" - сказали суровые сибирские мужики ;)

См. выше - бага!
Y = λf.(λx.f (x x)) (λx.f (x x))