Оберон-клуб «ВЄДАsoft»
https://zx.oberon.org/forum/

Standard Container Library
https://zx.oberon.org/forum/viewtopic.php?f=103&t=384
Страница 1 из 2

Автор:  Дмитрий Дагаев [ 21 мар 2018, 19:05 ]
Заголовок сообщения:  Standard Container Library

Система Scl для BlackBox. Standard Container Library реализует объекты vectors, lists, queues, stacks, maps безо всяких дженериков. Используются метаданные BlackBox Kernel.
http://www.zinnamturm.eu/downloadsOS.htm#Scl
https://blackbox.obertone.ru/component/Scl

Автор:  vlad [ 22 мар 2018, 16:48 ]
Заголовок сообщения:  Re: Standard Container Library

Дмитрий Дагаев писал(а):
Система Scl для BlackBox. Standard Container Library реализует объекты vectors, lists, queues, stacks, maps безо всяких дженериков. Используются метаданные BlackBox Kernel.
http://www.zinnamturm.eu/downloadsOS.htm#Scl
https://blackbox.obertone.ru/component/Scl


"Без дженериков" нас не удивишь, вопрос только насколько этим можно пользоваться. Есть там что-нибудь интересное, кроме обычных ограничений: объекты только в куче, кладем/достаем ANYPTR, касты на каждый чих, компаратор тоже с ANYPTR?

Автор:  geniepro [ 23 мар 2018, 08:20 ]
Заголовок сообщения:  Re: Standard Container Library

А почему, кстати, в Оберонах шаблоны и дженерики так и не прижились? Ведь были же эксперименты, да не пошли в массы...

Lightweight parametric polymorphism for Oberon

Oberon Templates от Алекса Ильина

Автор:  geniepro [ 23 мар 2018, 08:32 ]
Заголовок сообщения:  Re: Standard Container Library

Цитата:
№ 533 22-09-2005 09:16 Trurl

Цитата:
Ответ на »сообщение 511« (А.Хохлов)
___________________________
Я не знаток Оберона и апология C++ в мои цели тоже не входит, но не подойдет ли следующее:
написать функцию сортировки массивов элементов любого типа, для которых определена операция (или функция) сравнения


Мы теребили Гуткнехта по поводу родовых типов/параметрического полиморфизма. Его аргументы сводились к тому, что подобная общность встречается довольно редко. Как правило, требуется подстраивать алгоритмы в зависимости от типа данных. Не то, чтобы он нас совсем убедил, но как раз в случае сортировки его аргументация действенна.

Вот как-то так...

Автор:  Дмитрий Дагаев [ 23 мар 2018, 12:22 ]
Заголовок сообщения:  Re: Standard Container Library

vlad писал(а):
Дмитрий Дагаев писал(а):
Система Scl для BlackBox. Standard Container Library реализует объекты vectors, lists, queues, stacks, maps безо всяких дженериков. Используются метаданные BlackBox Kernel.
http://www.zinnamturm.eu/downloadsOS.htm#Scl
https://blackbox.obertone.ru/component/Scl


"Без дженериков" нас не удивишь, вопрос только насколько этим можно пользоваться. Есть там что-нибудь интересное, кроме обычных ограничений: объекты только в куче, кладем/достаем ANYPTR, касты на каждый чих, компаратор тоже с ANYPTR?

- объекты не обязательно в куче, элементы м.б. простыми RECORD;
- кладем RECORD, а не указатели с кастом;
- компаратор задан для встроенных ключевых полей INT16-64, (SHORT)CHAR8-256 с возможностью расширения пользовательскими типами.

Автор:  Дмитрий Дагаев [ 23 мар 2018, 12:29 ]
Заголовок сообщения:  Re: Standard Container Library

geniepro писал(а):
Цитата:
№ 533 22-09-2005 09:16 Trurl

Цитата:
Ответ на »сообщение 511« (А.Хохлов)
___________________________
Я не знаток Оберона и апология C++ в мои цели тоже не входит, но не подойдет ли следующее:
написать функцию сортировки массивов элементов любого типа, для которых определена операция (или функция) сравнения


Мы теребили Гуткнехта по поводу родовых типов/параметрического полиморфизма. Его аргументы сводились к тому, что подобная общность встречается довольно редко. Как правило, требуется подстраивать алгоритмы в зависимости от типа данных. Не то, чтобы он нас совсем убедил, но как раз в случае сортировки его аргументация действенна.

Вот как-то так...

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

Автор:  vlad [ 23 мар 2018, 18:00 ]
Заголовок сообщения:  Re: Standard Container Library

Дмитрий Дагаев писал(а):
- объекты не обязательно в куче, элементы м.б. простыми RECORD;


Копируются побитно? А указатели можно класть? А INTEGER?

Дмитрий Дагаев писал(а):
- кладем RECORD, а не указатели с кастом;


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

Дмитрий Дагаев писал(а):
- компаратор задан для встроенных ключевых полей INT16-64, (SHORT)CHAR8-256 с возможностью расширения пользовательскими типами.


Так а свой компаратор как задается?

Автор:  Дмитрий Дагаев [ 23 мар 2018, 19:24 ]
Заголовок сообщения:  Re: Standard Container Library

Цитата:
Копируются побитно? А указатели можно класть? А INTEGER?

Берется структура, например, с целым (или указателем)
Код: "OBERON"
  1.  
  2. MyRec = RECORD
  3. i1: INTEGER;
  4. END;
  5.  

И копируется побитно. Метаданные дают тип и длину.

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

ASSERT(v.r.Check(rec), 35) - несоответствие типа добавляемого типу в метаданных

Цитата:
Так а свой компаратор как задается?

Наследуем свой ключ, например LongKey от Base.Key,
Пишем функцию сравнения
Реализуем метод GetComparator
Добавляем новый ключ
Код: "OBERON"
  1.  
  2. PROCEDURE LongCompare (VAR n1: LONGINT; VAR n2: LONGINT): INTEGER;
  3. BEGIN
  4. RETURN SHORT(n1-n2)
  5. END LongCompare;
  6.  
  7. PROCEDURE (VAR ri: LongKey) GetComparator* (VAR compare: Base.Comparator);
  8. BEGIN
  9. SYSTEM.PUT(SYSTEM.ADR(compare), SYSTEM.ADR(LongCompare));
  10. END GetComparator;
  11.  
  12. .................
  13. lri: LongKeyPtr;
  14. .................
  15. NEW(lri); Base.dir.AddKey(lri);
  16.  

Автор:  vlad [ 23 мар 2018, 19:33 ]
Заголовок сообщения:  Re: Standard Container Library

vlad писал(а):
Каст возникает не когда кладется, а когда достается, чудес же не бывает?


Вопрос снимается. Достается через "специальное" типизированное поле, каста не надо. Я бы, наверное, предпочел бы лучше каст, чем подбные соглашения и игры с SYSTEM, да и с индексом есть шанс запутаться, но тут уж на вкус и цвет...

Автор:  vlad [ 23 мар 2018, 19:44 ]
Заголовок сообщения:  Re: Standard Container Library

Дмитрий Дагаев писал(а):
ASSERT(v.r.Check(rec), 35) - несоответствие типа добавляемого типу в метаданных


Я посмотрел - проверка идет на точное соответствие типа, без учета наследования. Это так задумано или просто проще?

Дмитрий Дагаев писал(а):
Наследуем свой ключ, например LongKey от Base.Key,
Пишем функцию сравнения
Реализуем метод GetComparator


Т.е. мне надо будет объявить столько типов контейнеров сколько у меня способов сортировки? Мне кажется это не очень удобно. Раз уж нас все равно динамика, то логичнее было бы компаратор сделать параметром Sort().

Дмитрий Дагаев писал(а):
PROCEDURE (VAR ri: LongKey) GetComparator* (VAR compare: Base.Comparator);
BEGIN
SYSTEM.PUT(SYSTEM.ADR(compare), SYSTEM.ADR(LongCompare));
END GetComparator;


SYSTEM.PUT/SYSTEM.ADDR в прикладном (даже не библиотечном) коде?

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