OberonCore
https://forum.oberoncore.ru/

Массивы нулевой длины
https://forum.oberoncore.ru/viewtopic.php?f=27&t=6374
Страница 5 из 5

Автор:  Rifat [ Четверг, 21 Май, 2020 11:13 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Нашел мнение Дейкстры по данному поводу EWD662.
Цитата:
The three quoted sentences strongly suggest to me that the YELLOW Language requires that in the array declaration the low bound for each index does not exceed its high bound, and hence it is impossible to declare an empty array! (This interpretation is subject to doubt. On the one hand we find the quoted error among those "a compiler for our language must detect" and it is not mentioned under the sample of traps and exceptions "for which compiled code and runtime systems must provide" (p.L-116); on the other hand the text refers to "Arrays whose index ranges are determined only on entry to the scope of their declaration (p.F-12).)

Now the exclusion of the empty array is absolutely silly. One of the great improvements of ALGOL 60 over FORTRAN at that time was that in FORTRAN's DO loop the repeatable statement had to be executed at least once, whereas in ALGOL 60's for statement zero executions of the repeatable statement was permissible. ALGOL 60 failed to introduce the same generality for arrays, but I find it unbelievable to see that 18 years later that same mistake is still fairly faithfully, and to see the empty set —500 years after the introduction of the digit zero in the Western world— still treated as a second class citizen. (For the pragmatists who are insensitive to the verdict of mathematical immaturity: to allow the empty array as well would have simplified the language and its implementation, as it would have reduced the number of error messages by one.)

Автор:  adimetrius [ Четверг, 21 Май, 2020 16:04 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Info21 писал(а):
Несколько раз возникало желание, чтобы были возможны массивы нулевой длины, -- как раз такой "нулевой случай".

Разделяю. И с практической, и с теоретической т.зр. Интересно бы узнать соображения Вирта по этому вопросу...

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


Перечитал Сообщение о языке КП, разделы 6.2, 6.4 10.3 - и не нашел там, что ослаблять. Выходит, вроде как в КП и ослаблять нечего, нулевая длина разрешена... И нынешняя реализация не вполне соответствует Сообщению. :shock:

Info21 писал(а):
Все существующие пакеты имеют подразумеваемое предусловие LEN()>0.
Передавать иное -- ошибка того, кто передаёт.
Обращения к элементам out of range защищены дважды: в коде и в проверках, встроенных компилятором.

Что пропущено?


В моем лично коде могут возникнуть трудности в случае открытых массивов - параметров:

PROCEDURE P ([IN/VAR] a: ARRAY OF T);

Вот в такой процедуре я всегда рассуждал "к a[0] можно обращаться без проверок". И, видимо, был не прав. Но это редкость, конечно - чаще вставляется универсальная проверка с LEN(a).

Info21, а вы просто порассуждать хотели на эту тему, или у вас есть некие предложения?

Автор:  Info21 [ Четверг, 21 Май, 2020 16:47 ]
Заголовок сообщения:  Re: Массивы нулевой длины

adimetrius писал(а):
Info21, а вы просто порассуждать хотели на эту тему, или у вас есть некие предложения?
"просто порассуждать" у меня сил нет ))

Просто несколько раз я сталкивался с тем, что требуется особый код для компенсации отсутствия нулевого варианта.
При этом сам всегда учу проектировать процедуры так, чтобы они обрабатывали нулевой случай -- потому что это действительно простое логическое обобщение числового нуля.

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

Но всё-таки мысль намозолилась, чтобы однажды воплотиться в первую запись этой ветки ))

А предложение простое -- разрешить массивы нулевой длины.

Автор:  Валерий Лаптев [ Четверг, 21 Май, 2020 19:44 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Ну, Боб Мартин по этому поводу написал главу Null Object.
Если создавать новый тип, то "нулевое" значение должно быть описано.
Может быть, создать некий модуль, в котором описать массив с полем-количеством элементов.
И соответственно, для работы с массивами его использовать.

Автор:  Info21 [ Пятница, 22 Май, 2020 00:05 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Валерий Лаптев писал(а):
Ну, Боб Мартин по этому поводу написал главу Null Object.
Целую главу??

Автор:  adimetrius [ Пятница, 22 Май, 2020 00:34 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Валерий Лаптев писал(а):
Если создавать новый тип, то "нулевое" значение должно быть описано.

А чем плох LEN(a) = 0? И не нужны новые сущности
Код:
VAR a: ARRAY OF ARRAY OF ARRAY N OF T;
...
i := 0; WHILE i < LEN(a, 0) DO
  IF LEN(a, 1) = 0 THEN ... ELSE ... END;
  INC(i)
END;

Поскольку в КП нет массивов-литералов вообще, то и не нужен особый литерал для пустого массива, типа NULL, NIL или [].

Автор:  Валерий Лаптев [ Пятница, 22 Май, 2020 08:54 ]
Заголовок сообщения:  Re: Массивы нулевой длины

1. В книге: Принципы, паттерны и методики гибкой разработки на С#.
Глава 25. Null-объект.
Небольшая, но отдельная глава - подчеркивается важность темы.
У него там запрос к БД. И вопрос: а если данных по запросу не существует ?
И он рисует паттерн Null-объект.

2. Len() - это сколько элементов выделено.
А количество элементов - это сколько там реально элементов.
В stl len() = capacity()
а количество элементов = size()

Мы можем мерить размер массива именно количеством элементов в нем.
Тогда 0 элементов - это и будет массив нулевой длины.

Естественно, надо писать модуль (и/или класс), в котором такая идеология будет реализована.

3. В С++ массивы нулевой длины есть, но для повседневной практики они никогда не применяются, ибо бесполезны.
Массив не имеет методов проверки количества элементов
А вот реализованные в stl контейнеры с проверками size() == 0 - повсеместно.

Автор:  Info21 [ Пятница, 22 Май, 2020 09:07 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Вот и топить всех в Байкале...

Автор:  Валерий Лаптев [ Пятница, 22 Май, 2020 11:16 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Кстати, я на Байкале еще не был. И на "Байкале" пока не работал
:lol: :lol: :lol:

Автор:  adimetrius [ Пятница, 22 Май, 2020 11:35 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Info21 писал(а):
Вот и топить всех в Байкале...


Не, так нельзя, нужно беречь Байкал!

Автор:  adimetrius [ Пятница, 22 Май, 2020 11:47 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Валерий Лаптев писал(а):
2. Len() - это сколько элементов выделено.
А количество элементов - это сколько там реально элементов.

Как будто в России язык разрабатывали: выделено столько-то, а реально столько-то. Шучу.

КП разрабатывали в Швейцарии, старались, как попроще, поэтому есть у массива один параметр: длина. Определяется LEN(). И я настаиваю, что они никакие не динамические: если a: ARRAY, LEN(a, N) - это константа. Даже когда p: POINTER TO ARRAY OF T, обращение NEW(p, 16) создает (безымянную) переменную типа ARRAY 16 OF T - массив фиксированного размера; следующий NEW(a, 32) создает другую переменную типа ARRAY 32 OF T - тоже фиксированного. Ничего в динамике не меняется.

Автор:  adimetrius [ Пятница, 22 Май, 2020 12:08 ]
Заголовок сообщения:  Re: Массивы нулевой длины

А вот use case.

PROCEDURE P (IN p: ARRAY OF T); (* P не может получить нулевой массив *)
BEGIN
len := LEN(p)
END P;

PROCEDURE Q (p: POINTER TO ARRAY OF T); (* Q тоже не может получить нулевой массив, но может получить NIL как синоним нулевого массива *)
BEGIN
IF p # NIL THEN len := 0 ELSE LEN := LEN(p) END
END Q;

При этом в нынешней реализации КП в ББ обращение к открытому массиву в P существенно эффективнее реализовано, чем в Q.

PROCEDURE R;
VAR p: POINTER TO ARRAY OF T;
BEGIN
P(p); (* разыменование, NIL Не пройдет. А хотелось бы... *)
Q(p)
END R;

А хотелось бы, в этом конкретном примере, чтобы p = NIL разыменовывалось в ARRAY 0 OF T.
-----------
ПС Коллеги, это мысли вслух, а не конкретное предложение.

Автор:  Info21 [ Пятница, 22 Май, 2020 15:18 ]
Заголовок сообщения:  Re: Массивы нулевой длины

adimetrius писал(а):
Info21 писал(а):
Вот и топить всех в Байкале...


Не, так нельзя, нужно беречь Байкал!
Байкал их не заметит.

Задачка на тему REAL: если всех людей мира утопить в Байкале, на сколько повысится его уровень? Сначала обязательно попытаться угадать -- метр? десять? сто?

Автор:  adimetrius [ Пятница, 22 Май, 2020 16:25 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Любопытно, вышло 10м, или 1% его средней глубины. И правда, не заметит. Хотя я поставил на 100.
Только надо уточнить: это если все отверстия закупорить, и внутрь вода не попадет. Иначе на 10% меньше.
Ну, если не Байкал, то хоть людей поберечь. Можно, напр, их рукописи топить, раз уж они не горят.
А при чем здесь REAL?

Автор:  albobin [ Пятница, 22 Май, 2020 16:58 ]
Заголовок сообщения:  Re: Массивы нулевой длины

А у меня при 10 млрд народу по 100литров в каждом вышло всего ~3см
Забавно то, что если бы байкал был глубиной по колено, эффект был бы тот же.

Автор:  Info21 [ Суббота, 23 Май, 2020 16:01 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Ну, народу всё-таки меньше 10 миллиардов, и средний их объём меньше 100 л. (100 кг) -- много детей и худышек, причём в самой населённой части -- Азии.

А так по-грубому правильно -- маленькое количество сантиметров ))

REAL -- потому что большие числа (тренаж записи миллиардов и проч.) + деление.

Страница 5 из 5 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/