Автор Тема: Строки в О7  (Прочитано 32756 раз)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Строки в О7
« : Март 29, 2013, 03:59:38 pm »
Смотрим оригинальный репорт и пытаемся понять, что можно делать со строками (строковыми литералами).
1. объявить CONST
2. использовать в CASE (односимвольные)
3. присвоить в ARRAY N OF CHAR (забив нулями лишние ячейки)

Но нигде не вижу, что строку можно отдать в вызов процедуры. Т.е., WriteLn("Hello, World!") ну никак не написать. Только вот так:
VAR s: ARRAY 16 OF CHAR;
...
s := "Hello, World!";
WriteLn(s);

Можно предположить (из общих соображений), что строки должны автоматом конвертится в открытый ARRAY OF CHAR, причем константный (не VAR). Но в репорте даже намека на это нет (или я не вижу?).

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #1 : Март 29, 2013, 04:15:59 pm »
Можно предположить (из общих соображений), что строки должны автоматом конвертится в открытый ARRAY OF CHAR, причем константный (не VAR). Но в репорте даже намека на это нет (или я не вижу?).

"If the parameter is a value parameter, the corresponding actual parameter must be an expression."

В каких expression'ах могут участвовать строковые литералы?
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Строки в О7
« Ответ #2 : Март 29, 2013, 04:25:50 pm »
"If the parameter is a value parameter, the corresponding actual parameter must be an expression."

В каких expression'ах могут участвовать строковые литералы?

В смысле "Hello, World!" - вполне себе expression с точки зрения грамматики. Только тип у этого expression не ARRAY 13 OF CHAR, а хрен знает какой... Поэтому он не соответствует ни одному из возможных типов параметров.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #3 : Март 29, 2013, 04:34:26 pm »
"The type of each formal parameter is specified in the parameter list. For variable parameters, it
must be identical to the corresponding actual parameter's type, except in the case of a record,
where it must be a base type of the corresponding actual parameter's type."

Итого, вопрос в том, какой тип у строкового литерала :-) Я предполагаю, что у него спец. тип, который умеет неявно приводиться (да! неявное приведение типов в Обероне!) к чару либо массиву этих самых чаров. Следовательно, вероятно возможно вот такое:

PROCEDURE A(c : CHAR);
PROCEDURE B(a : ARRAY OF CHAR);
...
A("h");
B("h");
С expression'ами вроде понятно - строковый литерал может быть операндом в выражении. Следовательно как VAL-параметр строковый литерал может быть.

Вопрос остаетася может ли строковый литерал быть VAR-параметром? И если нет, то на каком основании. А если да - то что будет если его попробуют поменять?
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #4 : Март 29, 2013, 04:37:42 pm »
Вопрос остаетася может ли строковый литерал быть VAR-параметром? И если нет, то на каком основании. А если да - то что будет если его попробуют поменять?

Сам задаю вопрос, сам на него отвечаю:
Цитировать
In the case of variable parameters, the actual parameter must be a designator denoting a variable.
If it designates an element of a structured variable, the selector is evaluated when the formal/actual
parameter substitution takes place, i.e. before the execution of the procedure. If the parameter is a
value parameter, the corresponding actual parameter must be an expression.
Все, строковый литерал в качестве VAR-параметра выступать не может, ибо нет переменной.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #5 : Март 29, 2013, 04:44:58 pm »
Да, и еще замечание: если наплевать на секцию 9.1. Assignments, то схожая проблема что и со строковыми литералами возникает с NIL'ом. Ибо у NIL'а тоже такой же невнятный тип (даже еще более невнятный!).

Поэтому рабочий вариант видимо такой: использовать для проверки корректности соответствия актуальных и формальных параметров правила присваивания (9.1) на которые накладываются сверху правила из 10.1. В случае противоречий, правила из 10.1 имеют преимущество.
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Строки в О7
« Ответ #6 : Март 29, 2013, 04:52:15 pm »
Итого, вопрос в том, какой тип у строкового литерала :-) Я предполагаю, что у него спец. тип, который умеет неявно приводиться (да! неявное приведение типов в Обероне!) к чару либо массиву этих самых чаров.

Да, неявное приведение типа в доке по строгому языку смотрится некошерно. Да и уложиться нужно в 16 страниц. Печально все это. Тут уж не до неявных UB...

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Строки в О7
« Ответ #7 : Март 29, 2013, 04:55:11 pm »
Поэтому рабочий вариант видимо такой: использовать для проверки корректности соответствия актуальных и формальных параметров правила присваивания (9.1) на которые накладываются сверху правила из 10.1. В случае противоречий, правила из 10.1 имеют преимущество.

Присваивание тут тоже не работает - потому что массив в случае параметра открытый. А присваивание прописано только для массивов известной длины. Кроме того, массив - не скалярный тип, а присваивание формальных параметров упоминается только применительно к скалярным типам.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #8 : Март 29, 2013, 04:56:34 pm »
Итого, вопрос в том, какой тип у строкового литерала :-) Я предполагаю, что у него спец. тип, который умеет неявно приводиться (да! неявное приведение типов в Обероне!) к чару либо массиву этих самых чаров.

Да, неявное приведение типа в доке по строгому языку смотрится некошерно. Да и уложиться нужно в 16 страниц. Печально все это. Тут уж не до неявных UB...
Самое смешное, что "a" может приводиться и туда и сюда, а вот "aa" - уже нет :-) То есть по факту типы "a" и "aa" отличаются, это два разных типа!
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #9 : Март 29, 2013, 04:57:06 pm »
Поэтому рабочий вариант видимо такой: использовать для проверки корректности соответствия актуальных и формальных параметров правила присваивания (9.1) на которые накладываются сверху правила из 10.1. В случае противоречий, правила из 10.1 имеют преимущество.

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #10 : Март 29, 2013, 05:05:19 pm »
Читаем 9.1:
Цитировать
Strings can be assigned to any array of characters.
Нигде нет упоминания про то, что длина этого array'я должна быть известна.

И кстати, такой вопрос возникает:
MODULE TestModule;

VAR buf : ARRAY 8 OF CHAR;

PROCEDURE Test(VAR s : ARRAY OF CHAR)
BEGIN
   s := "01234567890123456789"
END Test

BEGIN
   Test(buf)
END TestModule.

Такое работать вообще будет? Или это ошибка компиляции? Или ошибка исполнения? Или что вообще?
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Строки в О7
« Ответ #11 : Март 29, 2013, 05:05:53 pm »

DddIzer

  • Гость
Re: Строки в О7
« Ответ #12 : Март 29, 2013, 07:29:20 pm »


Такое работать вообще будет? Или это ошибка компиляции? Или ошибка исполнения? Или что вообще?
решайте  сами... если Вирт  явно это не прописал... - значит  этот вопрос  не важен с точки зрения его видения Оберона.. т.е.  как реализатор вы можете выбрать любой путь..
я, например, бы выбрал следующий вариант - ошибка компиляции (предпочтительно), или  ошибка времени выполнения..

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #13 : Март 29, 2013, 07:32:13 pm »


Такое работать вообще будет? Или это ошибка компиляции? Или ошибка исполнения? Или что вообще?
решайте  сами... если Вирт  явно это не прописал... - значит  этот вопрос  не важен с точки зрения его видения Оберона.. т.е.  как реализатор вы можете выбрать любой путь..
я, например, бы выбрал следующий вариант - ошибка компиляции (предпочтительно), или  ошибка времени выполнения..

Проблема в том, что такое решение приведет к созданию диалекта языка. Причем диалекта не совместимого с другими "реализациями". Выходит язык Оберон описан так, что невозможно просто взять и реализовать его, любая реализация автоматически порождает несовместимый диалект в плане даже самых базовых вещей.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #14 : Март 29, 2013, 07:35:03 pm »
То есть когда я еще только погружался в описание языка Оберон, я полагал, что да, этот язык as is не годится для прикладного программиста, ибо он не сможет написать на нем даже hello world из за отсутствия в описании языка стандартной библиотеки для ввода-вывода.

Сейчас оказывается, что он не смог бы этого написать даже если бы таковая библиотека была бы описана в сообщении о языке.
Y = λf.(λx.f (x x)) (λx.f (x x))