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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #60 : Февраль 10, 2014, 03:01:06 pm »
Следующее расширение - STRING. Это будет value-тип
Фиксированной длины?

Нет конечно. Обычная иммутабельная строка любой длины. Можно смотреть на нее как на расширение ARRAY OF CHAR, только не модифицируемый и с добавленной операцией '+'.

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Oberon-07/13: заметки
« Ответ #61 : Февраль 11, 2014, 07:54:38 am »
Так ведь обычная иммутабельная строка любой длины является ссылочным типом: нужен указатель на буфер любой длины.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #62 : Февраль 11, 2014, 08:11:56 am »
Так ведь обычная иммутабельная строка любой длины является ссылочным типом: нужен указатель на буфер любой длины.

А иммутабельность как обеспечить? А оператор сложения? Кроме того, очень не хочется иметь NIL строки (по опыту шарпа сужу - дурной nullOrEmpty или как там его). Чтобы сделать нормальный STRING средствами языка нужно нехило расширить O7. Я пока пытаюсь маленькими шажками идти и хорошо проверенными.

P.S. Ну и конечно оно должно хорошо ложиться на JS строки. Вроде никаких серьезных препятствий для этого нет.
« Последнее редактирование: Февраль 11, 2014, 08:13:51 am от vlad »

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #63 : Март 23, 2014, 02:59:03 am »
Теперь результат процедуры можно вызывать (если это процедурный тип) или обращаться к полям (если это указатель): https://github.com/vladfolts/oberonjs/wiki/eberon-procedure-call-result

Штука, конечно, непринципиальная, но реально бесила...

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #64 : Март 31, 2014, 07:34:02 am »
Экспорт полей записи только для чтения (как в ББ) - https://github.com/vladfolts/oberonjs/wiki/eberon-record-fields-read-only-export.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #65 : Июнь 26, 2014, 03:44:00 pm »
Добавил сразу два расширения (одно зависит от другого):

1. Переменные "по месту" (избавляемся от VAR). Переменные можно объявлять (и одновременно инициализировать) везде в коде процедуры. Тип переменной выводится из выражения инициализации:
v <- f(); (* новая переменная 'v' такого же типа, как результат f() *)
https://github.com/vladfolts/oberonjs/wiki/Eberon-In-Place-Variables

2. Автоматическое приведение типа после проверки (аналог WITH), работает только с переменными по месту из пункта 1.
    IF pb IS PDerived THEN
        pb.derivedField := 123;
    END;

https://github.com/vladfolts/oberonjs/wiki/Eberon-Implicit-Type-Narrowing

ilovb

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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Oberon-07/13: заметки
« Ответ #67 : Июнь 27, 2014, 03:43:52 pm »
А вообще, вот это конкретное изменение (2), имхо, прямо противоположная идеям Оберона вещь. Т.е. не то чтобы плохо (за творческий поиск респект), но это уже совсем не Оберон.

valexey_u

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #69 : Июнь 27, 2014, 04:09:23 pm »
Похоже в компиляторе имеется баг:
MODULE T;
TYPE
    Base = RECORD END;
    PBase = POINTER TO Base;
    Derived = RECORD (Base) derivedField: INTEGER END;
    PDerived = POINTER TO Derived;
VAR
pbVar: PBase;
BEGIN
pb <- pbVar;
    IF pb IS PDerived THEN
        pb.derivedField := 123;
    END;

    ASSERT(~(pb IS PDerived) OR (pb.derivedField = 123));
END T.

TypeError: undefined is not a function
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #70 : Июнь 27, 2014, 04:13:28 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;
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #71 : Июнь 27, 2014, 04:36:39 pm »
А вообще, вот это конкретное изменение (2), имхо, прямо противоположная идеям Оберона вещь.

Какой именно идее оно противоречит? С точки зрения математики там все чисто и просто - доказывается истинность/ложность/непределенность выражения при заданном типе и любых других аргументах. Сложность там возникает только применительно к однопроходной схеме. Причем сложность не сколько в коде и его количестве, сколько в читабельности всего этого и понимании как оно работает + сильная завязка на конкретную грамматику.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #72 : Июнь 27, 2014, 04:39:25 pm »
TypeError: undefined is not a function

Ага. Issue пока не завел - пароль гитхабовский забыл :)

ilovb

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

Не понял шутку юмора. Так значит таки не работает? O_o

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Oberon-07/13: заметки
« Ответ #74 : Июнь 27, 2014, 04:56:22 pm »
TypeError: undefined is not a function

Ага. Issue пока не завел - пароль гитхабовский забыл :)

Завел: https://github.com/vladfolts/oberonjs/issues/47
Y = λf.(λx.f (x x)) (λx.f (x x))