Oberon space

General Category => Общий раздел => Тема начата: vlad от Январь 16, 2013, 05:06:04 pm

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

Кроме того, Вирт выпилил (по сравнению с ББ) возможность описания типа "по месту", оставив только qualident:
TYPE ProcType = PROCEDURE(): PROCEDURE; (* ошибка синтаксиса О7/11 *)
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: DddIzer от Январь 16, 2013, 05:10:36 pm
если нет - значит нет... о чем тут можно говорить? какой смысл сравнивать 07 - с КП в контексте данного вопроса.. КП проектировался другими людьми , с другими целями...
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: Kemet от Январь 16, 2013, 05:15:37 pm
TYPE ProcType = PROCEDURE(): PROCEDURE; (* ошибка синтаксиса О7/11 *)
А разве разрешены незавершенные спецификации (просто PROCEDURE)?
я вот
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: akron1 от Январь 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) эти присваивания разрешены (что вполне логично).
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: vlad от Январь 16, 2013, 09:27:18 pm
Репорт здесь ни причем. Невозможность рекурсивного описания я ввел, чтобы не допускать такие объявления:

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

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

Хотя мы здесь и получим бесконечную рекурсию в рантайме, но при желании от нее можно избавиться (если создавать поле 'x' on demand).
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: Kemet от Январь 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;
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: Илья Ермаков от Январь 20, 2013, 10:39:08 pm
TYPE ProcType = PROCEDURE(): ProcType; (* В ББ работает *)

Но если учесть, что процедурный тип в Оберонах совместим не по имени, а по сигнатуре, то это то же самое, что:
TYPE P = PROCEDURE (): PROCEDURE
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: vlad от Январь 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 без понятия "рекурсивного типа" уже не обойтись - иначе получим бесконечную рекурсию при разворачивании/сопоставлении таких сигнатур.
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: valexey_u от Январь 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 без понятия "рекурсивного типа" уже не обойтись - иначе получим бесконечную рекурсию при разворачивании/сопоставлении таких сигнатур.

И самое обидное, что в сообщении о языке про это не сказано ровным счетом НИЧЕГО.
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: Geniepro от Январь 21, 2013, 04:20:53 pm
Не пытайтесь сделать из Оберона ФЯ -- зачем вам все эти процедуры высшего порядка и всё такое? )))
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: valexey_u от Январь 21, 2013, 04:24:53 pm
Не пытайтесь сделать из Оберона ФЯ -- зачем вам все эти процедуры высшего порядка и всё такое? )))
Затем же зачем и в Си - там это обычное дело.
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: valexey_u от Январь 21, 2013, 04:45:06 pm
TYPE ProcType = PROCEDURE(): ProcType; (* В ББ работает *)

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

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

Также из сообщения о языке не следует что структурные типы совместимы по имени а не по структуре.
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: Geniepro от Январь 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].

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

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

ЗЫ. Кстати, а есть ли в натуре (в природе :В) перевод сообщения на русский язык? А то от этого инглиша уже глазная аллергия )))
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: valexey_u от Январь 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 типизацию строковых литералов). То есть для литерала запросто может не быть соответствующего типа из множества типов переменных.
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: ilovb от Январь 21, 2013, 05:36:35 pm
ЗЫ. Кстати, а есть ли в натуре (в природе :В) перевод сообщения на русский язык? А то от этого инглиша уже глазная аллергия )))
Есть за 2008 год:
https://sites.google.com/site/oberonsystems/home/azyki-semejstva-oberon
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: Илья Ермаков от Январь 21, 2013, 08:24:41 pm
Не пытайтесь сделать из Оберона ФЯ -- зачем вам все эти процедуры высшего порядка и всё такое? )))

Например, процедура может возвращать как выходной параметр своё продолжение....
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: Geniepro от Январь 21, 2013, 08:42:26 pm
Не пытайтесь сделать из Оберона ФЯ -- зачем вам все эти процедуры высшего порядка и всё такое? )))

Например, процедура может возвращать как выходной параметр своё продолжение....

Разве для оберона все эти ФП-приколы идиоматичны? о_О  ;D
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: valexey_u от Январь 21, 2013, 08:47:03 pm
Не пытайтесь сделать из Оберона ФЯ -- зачем вам все эти процедуры высшего порядка и всё такое? )))

Например, процедура может возвращать как выходной параметр своё продолжение....

Разве для оберона все эти ФП-приколы идиоматичны? о_О  ;D

Я не вижу тут особых отличий Оберона он Си. А для Сей оно вполне идиоматично.
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: Geniepro от Январь 22, 2013, 05:07:45 am
Разве для оберона все эти ФП-приколы идиоматичны? о_О  ;D

Я не вижу тут особых отличий Оберона он Си. А для Сей оно вполне идиоматично.

Для Сей вполне идиоматично писать так:
while (*a++=*b++);Что, будем тащить эту идиому в обероны?
Название: Re: И еще раз про процедрный тип в О7/11
Отправлено: vlad от Январь 24, 2013, 04:51:26 am
Посмотрел в ББ:
TYPE ProcType1 = PROCEDURE(p: ProcType1): ProcType1;
     ProcType2 = PROCEDURE(p: ProcType2): ProcType2;

ProcType1 и ProcType2 считаются несовместимыми.