Oberon space
General Category => Общий раздел => Тема начата: vlad от Январь 16, 2013, 05:06:04 pm
-
Не нашел в репорте ни слова про возможность/невозможность рекурсивного описания:
TYPE ProcType = PROCEDURE(): ProcType; (* В ББ работает *)
Кроме того, Вирт выпилил (по сравнению с ББ) возможность описания типа "по месту", оставив только qualident:
TYPE ProcType = PROCEDURE(): PROCEDURE; (* ошибка синтаксиса О7/11 *)
-
если нет - значит нет... о чем тут можно говорить? какой смысл сравнивать 07 - с КП в контексте данного вопроса.. КП проектировался другими людьми , с другими целями...
-
TYPE ProcType = PROCEDURE(): PROCEDURE; (* ошибка синтаксиса О7/11 *)
А разве разрешены незавершенные спецификации (просто PROCEDURE)?
я вот
-
Не нашел в репорте ни слова про возможность/невозможность рекурсивного описания:
Репорт здесь ни причем. Невозможность рекурсивного описания я ввел, чтобы не допускать такие объявления:
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) эти присваивания разрешены (что вполне логично).
-
Репорт здесь ни причем. Невозможность рекурсивного описания я ввел, чтобы не допускать такие объявления:
Ну на самом деле рекурсивные объявления имеет смысл запрещать только тогда, когда такая рекурсия не позволяет сгенерить конечный код (в данной реализации). Т.е., если код RECORD зависит от ее полей (как в твоей реализации), то для рекурсивной структуры код нельзя сгенерировать. Если же код не зависит от полей (например если у нас конечный код - жабаскрипт), то почему бы и нет.
TYPE R = RECORD x: R END
Можно представить на жабоскрипте как:
function R(){
this.x = new R();
}
Хотя мы здесь и получим бесконечную рекурсию в рантайме, но при желании от нее можно избавиться (если создавать поле 'x' on demand).
-
Компилятор от 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;
-
TYPE ProcType = PROCEDURE(): ProcType; (* В ББ работает *)
Но если учесть, что процедурный тип в Оберонах совместим не по имени, а по сигнатуре, то это то же самое, что:
TYPE P = PROCEDURE (): PROCEDURE
-
TYPE ProcType = PROCEDURE(): ProcType; (* В ББ работает *)
Но если учесть, что процедурный тип в Оберонах совместим не по имени, а по сигнатуре, то это то же самое, что:
TYPE P = PROCEDURE (): PROCEDURE
Не, не то же самое. Тип PROCEDURE не имеет возвращаемого типа. Так что без явной рекурсии такой тип ну никак не описать.
С сигнатурами, кстати, тоже все интересно:
TYPE ProcType1 = PROCEDURE(p: ProcType1): ProcType1;
ProcType2 = PROCEDURE(p: ProcType2): ProcType2;
Так вот. Я могу представить себе реализацию компилятора, в которой подобные рекурсивные определения работают без дополнительных приседаний (на момент анализа идентификатора типа возвращаемого значения в скопе уже есть (недоопределнный) тип "ProcType1", на который можно получить ссылку - все компилируется).
Но вот для анализа совместимости сигнатур ProcType1 и ProcType2 без понятия "рекурсивного типа" уже не обойтись - иначе получим бесконечную рекурсию при разворачивании/сопоставлении таких сигнатур.
-
TYPE ProcType = PROCEDURE(): ProcType; (* В ББ работает *)
Но если учесть, что процедурный тип в Оберонах совместим не по имени, а по сигнатуре, то это то же самое, что:
TYPE P = PROCEDURE (): PROCEDURE
Не, не то же самое. Тип PROCEDURE не имеет возвращаемого типа. Так что без явной рекурсии такой тип ну никак не описать.
С сигнатурами, кстати, тоже все интересно:
TYPE ProcType1 = PROCEDURE(p: ProcType1): ProcType1;
ProcType2 = PROCEDURE(p: ProcType2): ProcType2;
Так вот. Я могу представить себе реализацию компилятора, в которой подобные рекурсивные определения работают без дополнительных приседаний (на момент анализа идентификатора типа возвращаемого значения в скопе уже есть (недоопределнный) тип "ProcType1", на который можно получить ссылку - все компилируется).
Но вот для анализа совместимости сигнатур ProcType1 и ProcType2 без понятия "рекурсивного типа" уже не обойтись - иначе получим бесконечную рекурсию при разворачивании/сопоставлении таких сигнатур.
И самое обидное, что в сообщении о языке про это не сказано ровным счетом НИЧЕГО.
-
Не пытайтесь сделать из Оберона ФЯ -- зачем вам все эти процедуры высшего порядка и всё такое? )))
-
Не пытайтесь сделать из Оберона ФЯ -- зачем вам все эти процедуры высшего порядка и всё такое? )))
Затем же зачем и в Си - там это обычное дело.
-
TYPE ProcType = PROCEDURE(): ProcType; (* В ББ работает *)
Но если учесть, что процедурный тип в Оберонах совместим не по имени, а по сигнатуре, то это то же самое, что:
TYPE P = PROCEDURE (): PROCEDURE
А откуда это следует? В смысле что в Обероне тип процедурный совместим не по имени а по сигнатуре? На репорты Оберона-2 и КП просьба не ссылаться. У нас все же тут Oberon-07/11.
Также из сообщения о языке не следует что структурные типы совместимы по имени а не по структуре.
-
А откуда это следует? В смысле что в Обероне тип процедурный совместим не по имени а по сигнатуре? На репорты Оберона-2 и КП просьба не ссылаться. У нас все же тут Oberon-07/11.
А вот откуда:
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].
Раз упоминается, что должны совпадать списки формальных параметров и результатов, то значит используется структурная типизация.
Также из сообщения о языке не следует что структурные типы совместимы по имени а не по структуре.
Бегло просмотрел сообщение о языке и тоже не заметил там явного ответа на этот вопрос...
ЗЫ. Кстати, а есть ли в натуре (в природе :В) перевод сообщения на русский язык? А то от этого инглиша уже глазная аллергия )))
-
А откуда это следует? В смысле что в Обероне тип процедурный совместим не по имени а по сигнатуре? На репорты Оберона-2 и КП просьба не ссылаться. У нас все же тут Oberon-07/11.
А вот откуда:
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 типизацию строковых литералов). То есть для литерала запросто может не быть соответствующего типа из множества типов переменных.
-
ЗЫ. Кстати, а есть ли в натуре (в природе :В) перевод сообщения на русский язык? А то от этого инглиша уже глазная аллергия )))
Есть за 2008 год:
https://sites.google.com/site/oberonsystems/home/azyki-semejstva-oberon
-
Не пытайтесь сделать из Оберона ФЯ -- зачем вам все эти процедуры высшего порядка и всё такое? )))
Например, процедура может возвращать как выходной параметр своё продолжение....
-
Не пытайтесь сделать из Оберона ФЯ -- зачем вам все эти процедуры высшего порядка и всё такое? )))
Например, процедура может возвращать как выходной параметр своё продолжение....
Разве для оберона все эти ФП-приколы идиоматичны? о_О ;D
-
Не пытайтесь сделать из Оберона ФЯ -- зачем вам все эти процедуры высшего порядка и всё такое? )))
Например, процедура может возвращать как выходной параметр своё продолжение....
Разве для оберона все эти ФП-приколы идиоматичны? о_О ;D
Я не вижу тут особых отличий Оберона он Си. А для Сей оно вполне идиоматично.
-
Разве для оберона все эти ФП-приколы идиоматичны? о_О ;D
Я не вижу тут особых отличий Оберона он Си. А для Сей оно вполне идиоматично.
Для Сей вполне идиоматично писать так:
while (*a++=*b++);
Что, будем тащить эту идиому в обероны?
-
Посмотрел в ББ:
TYPE ProcType1 = PROCEDURE(p: ProcType1): ProcType1;
ProcType2 = PROCEDURE(p: ProcType2): ProcType2;
ProcType1 и ProcType2 считаются несовместимыми.