Автор Тема: И еще раз про процедрный тип в О7/11  (Прочитано 8457 раз)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
И еще раз про процедрный тип в О7/11
« : Январь 16, 2013, 05:06:04 pm »
Не нашел в репорте ни слова про возможность/невозможность рекурсивного описания:
TYPE ProcType = PROCEDURE(): ProcType; (* В ББ работает *)

Кроме того, Вирт выпилил (по сравнению с ББ) возможность описания типа "по месту", оставив только qualident:
TYPE ProcType = PROCEDURE(): PROCEDURE; (* ошибка синтаксиса О7/11 *)

DddIzer

  • Гость
Re: И еще раз про процедрный тип в О7/11
« Ответ #1 : Январь 16, 2013, 05:10:36 pm »
если нет - значит нет... о чем тут можно говорить? какой смысл сравнивать 07 - с КП в контексте данного вопроса.. КП проектировался другими людьми , с другими целями...
« Последнее редактирование: Январь 16, 2013, 05:13:04 pm от DddIzer »

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: И еще раз про процедрный тип в О7/11
« Ответ #2 : Январь 16, 2013, 05:15:37 pm »
TYPE ProcType = PROCEDURE(): PROCEDURE; (* ошибка синтаксиса О7/11 *)
А разве разрешены незавершенные спецификации (просто PROCEDURE)?
я вот

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: И еще раз про процедрный тип в О7/11
« Ответ #3 : Январь 16, 2013, 09:09:28 pm »
Не нашел в репорте ни слова про возможность/невозможность рекурсивного описания:

Репорт здесь ни причем. Невозможность рекурсивного описания я ввел, чтобы не допускать такие объявления:

CONST c = c;
TYPE A = ARRAY 10 OF A;
TYPE R = RECORD x: R END;
VAR v: v;

такое объявление:

TYPE P = POINTER TO RECORD x: P END;

можно заменить на

TYPE P = POINTER TO R; R = RECORD x: P END;

а об этом:

TYPE P = PROCEDURE(): P;

я просто не подумал  :)

Вообще же, в репорте много неясностей. Например, если следовать репорту, то:

TYPE
P1 = POINTER TO R1;
P2 = POINTER TO R2;
R1 = RECORD ... END;
R2 = RECORD (R1) ... END;

VAR a: P1; b: P2;

a := b; (*запрещено*)

TYPE
p1 = PROCEDURE;
p2 = PROCEDURE;
VAR a: p1; b: p2;

a := b; (*запрещено*)

хотя в репорте Oberon-2 (и в реализации Oberon-07 Astrobe) эти присваивания разрешены (что вполне логично).

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: И еще раз про процедрный тип в О7/11
« Ответ #4 : Январь 16, 2013, 09:27:18 pm »
Репорт здесь ни причем. Невозможность рекурсивного описания я ввел, чтобы не допускать такие объявления:

Ну на самом деле рекурсивные объявления имеет смысл запрещать только тогда, когда такая рекурсия не позволяет сгенерить конечный код (в данной реализации). Т.е., если код RECORD зависит от ее полей (как в твоей реализации), то для рекурсивной структуры код нельзя сгенерировать. Если же код не зависит от полей (например если у нас конечный код - жабаскрипт), то почему бы и нет.
TYPE R = RECORD x: R END

Можно представить на жабоскрипте как:
function R(){
    this.x = new R();
}

Хотя мы здесь и получим бесконечную рекурсию в рантайме, но при желании от нее можно избавиться (если создавать поле 'x' on demand).

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: И еще раз про процедрный тип в О7/11
« Ответ #5 : Январь 17, 2013, 06:36:48 am »
Компилятор от Ling Liu этот код кушает:
TYPE P = POINTER TO RECORD x: P END;

а этот код нет:
TYPE ProcType = PROCEDURE(): ProcType;

это проходит:
TYPE
P1 = POINTER TO R1;
P2 = POINTER TO R2;
R1 = RECORD ... END;
R2 = RECORD (R1) ... END;

VAR a: P1; b: P2;

a := b;

это тоже:
TYPE
p1 = PROCEDURE;
p2 = PROCEDURE;
VAR a: p1; b: p2;

a := b;

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: И еще раз про процедрный тип в О7/11
« Ответ #6 : Январь 20, 2013, 10:39:08 pm »
TYPE ProcType = PROCEDURE(): ProcType; (* В ББ работает *)

Но если учесть, что процедурный тип в Оберонах совместим не по имени, а по сигнатуре, то это то же самое, что:
TYPE P = PROCEDURE (): PROCEDURE

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: И еще раз про процедрный тип в О7/11
« Ответ #7 : Январь 21, 2013, 03:51:32 pm »
TYPE ProcType = PROCEDURE(): ProcType; (* В ББ работает *)

Но если учесть, что процедурный тип в Оберонах совместим не по имени, а по сигнатуре, то это то же самое, что:
TYPE P = PROCEDURE (): PROCEDURE

Не, не то же самое. Тип PROCEDURE не имеет возвращаемого типа. Так что без явной рекурсии такой тип ну никак не описать.
С сигнатурами, кстати, тоже все интересно:
TYPE ProcType1 = PROCEDURE(p: ProcType1): ProcType1;
     ProcType2 = PROCEDURE(p: ProcType2): ProcType2;

Так вот. Я могу представить себе реализацию компилятора, в которой подобные рекурсивные определения работают без дополнительных приседаний (на момент анализа идентификатора типа возвращаемого значения в скопе уже есть (недоопределнный) тип "ProcType1", на который можно получить ссылку - все компилируется).
Но вот для анализа совместимости сигнатур ProcType1 и ProcType2 без понятия "рекурсивного типа" уже не обойтись - иначе получим бесконечную рекурсию при разворачивании/сопоставлении таких сигнатур.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: И еще раз про процедрный тип в О7/11
« Ответ #8 : Январь 21, 2013, 03:58:14 pm »
TYPE ProcType = PROCEDURE(): ProcType; (* В ББ работает *)

Но если учесть, что процедурный тип в Оберонах совместим не по имени, а по сигнатуре, то это то же самое, что:
TYPE P = PROCEDURE (): PROCEDURE

Не, не то же самое. Тип PROCEDURE не имеет возвращаемого типа. Так что без явной рекурсии такой тип ну никак не описать.
С сигнатурами, кстати, тоже все интересно:
TYPE ProcType1 = PROCEDURE(p: ProcType1): ProcType1;
     ProcType2 = PROCEDURE(p: ProcType2): ProcType2;

Так вот. Я могу представить себе реализацию компилятора, в которой подобные рекурсивные определения работают без дополнительных приседаний (на момент анализа идентификатора типа возвращаемого значения в скопе уже есть (недоопределнный) тип "ProcType1", на который можно получить ссылку - все компилируется).
Но вот для анализа совместимости сигнатур ProcType1 и ProcType2 без понятия "рекурсивного типа" уже не обойтись - иначе получим бесконечную рекурсию при разворачивании/сопоставлении таких сигнатур.

И самое обидное, что в сообщении о языке про это не сказано ровным счетом НИЧЕГО.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: И еще раз про процедрный тип в О7/11
« Ответ #9 : Январь 21, 2013, 04:20:53 pm »
Не пытайтесь сделать из Оберона ФЯ -- зачем вам все эти процедуры высшего порядка и всё такое? )))
to iterate is human, to recurse, divine

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: И еще раз про процедрный тип в О7/11
« Ответ #10 : Январь 21, 2013, 04:24:53 pm »
Не пытайтесь сделать из Оберона ФЯ -- зачем вам все эти процедуры высшего порядка и всё такое? )))
Затем же зачем и в Си - там это обычное дело.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: И еще раз про процедрный тип в О7/11
« Ответ #11 : Январь 21, 2013, 04:45:06 pm »
TYPE ProcType = PROCEDURE(): ProcType; (* В ББ работает *)

Но если учесть, что процедурный тип в Оберонах совместим не по имени, а по сигнатуре, то это то же самое, что:
TYPE P = PROCEDURE (): PROCEDURE

А откуда это следует? В смысле что в Обероне тип процедурный совместим не по имени а по сигнатуре? На репорты Оберона-2 и КП просьба не ссылаться. У нас все же тут Oberon-07/11.

Также из сообщения о языке не следует что структурные типы совместимы по имени а не по структуре.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: И еще раз про процедрный тип в О7/11
« Ответ #12 : Январь 21, 2013, 05:16:36 pm »
А откуда это следует? В смысле что в Обероне тип процедурный совместим не по имени а по сигнатуре? На репорты Оберона-2 и КП просьба не ссылаться. У нас все же тут Oberon-07/11.

А вот откуда:
Цитата: Niklaus Wirth "The Programming Language Oberon Revision 22.9.2011"
6.5. Procedure types
Variables of a procedure type T have a procedure (or NIL) as value. If a procedure P is assigned to
a procedure variable of type T, the (types of the) formal parameters of P must be the same as those
indicated in the formal parameters of T. The same holds for the result type in the case of a function
procedure (see 10.1).
P must not be declared local to another procedure, and neither can it be a
standard procedure.
ProcedureType = PROCEDURE [FormalParameters].

Раз упоминается, что должны совпадать списки формальных параметров и результатов, то значит используется структурная типизация.

Также из сообщения о языке не следует что структурные типы совместимы по имени а не по структуре.
Бегло просмотрел сообщение о языке и тоже не заметил там явного ответа на этот вопрос...

ЗЫ. Кстати, а есть ли в натуре (в природе :В) перевод сообщения на русский язык? А то от этого инглиша уже глазная аллергия )))
to iterate is human, to recurse, divine

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: И еще раз про процедрный тип в О7/11
« Ответ #13 : Январь 21, 2013, 05:21:36 pm »
А откуда это следует? В смысле что в Обероне тип процедурный совместим не по имени а по сигнатуре? На репорты Оберона-2 и КП просьба не ссылаться. У нас все же тут Oberon-07/11.

А вот откуда:
Цитата: Niklaus Wirth "The Programming Language Oberon Revision 22.9.2011"
6.5. Procedure types
Variables of a procedure type T have a procedure (or NIL) as value. If a procedure P is assigned to
a procedure variable of type T, the (types of the) formal parameters of P must be the same as those
indicated in the formal parameters of T. The same holds for the result type in the case of a function
procedure (see 10.1).
P must not be declared local to another procedure, and neither can it be a
standard procedure.
ProcedureType = PROCEDURE [FormalParameters].

Раз упоминается, что должны совпадать списки формальных параметров и результатов, то значит используется структурная типизация.
Здесь говорится лишь о совместимости процедурных типов с конкретными процедурами, но ничего не говорится о совместимости процедурных типов друг с другом.

Процедура сама по себе - это такой литерал для процедурных переменных. Типизация у литералов не всегда 1 в 1 отображается на типы для переменных (см. в том же Обероне-07 типизацию строковых литералов). То есть для литерала запросто может не быть соответствующего типа из множества типов переменных.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: И еще раз про процедрный тип в О7/11
« Ответ #14 : Январь 21, 2013, 05:36:35 pm »
ЗЫ. Кстати, а есть ли в натуре (в природе :В) перевод сообщения на русский язык? А то от этого инглиша уже глазная аллергия )))
Есть за 2008 год:
https://sites.google.com/site/oberonsystems/home/azyki-semejstva-oberon