Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 28 мар 2024, 23:10

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: ANYARRAY вдобавок к ANYREC
СообщениеДобавлено: 31 дек 2018, 00:06 
Не в сети

Сообщения: 350
Среда времени выполнения blackboxcomponentbuilder знает о массивах всё: размерности и тип элементов. Но пользователю
эта информация недоступна. Для общности следовало бы иметь аналог WITH для массивов. Понятно, почему этого нет, но раз мы хотим ввести динамическую типизацию, теперь придётся это сделать.
Пока что не хотим морочиться с отдельным типом - пусть типом будет блок. Потом нужно будет
завести ANYARRAY. Нужен примерно такой набор функций:
Код: "OBERON"
  1.  
  2. БлокМассива(э : любой массив):Kernel.Block; (* Встроенная функция *)
  3. МассивЭтоЛи(блок: Kernel.Block):BOOLEAN; (* можно извлечь из Kernel.Mark *)
  4. ТипЭлементаМассива(м: Kernel.Block):Kernel.Type;
  5. ЧислоИзмеренийМассива(м: Kernel.Block):INTEGER;
  6. ДлинаОдногоИзмерения(м: Kernel.Block, и:INTEGER):INTEGER;
  7.  

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: ANYARRAY вдобавок к ANYREC
СообщениеДобавлено: 31 дек 2018, 01:23 
Не в сети

Сообщения: 146
В Обероне массив N-й размерности - это всего лишь массив 1-й размерности массивов (N-1) размерности


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: ANYARRAY вдобавок к ANYREC
СообщениеДобавлено: 31 дек 2018, 08:43 
Не в сети

Сообщения: 108
budden писал(а):
Для общности следовало бы иметь аналог WITH для массивов.


А кроме "общности" - можно придумать хоть какой-то осмысленный пример когда это надо? Массивы сами по себе это неинтересные низкоуровневые кирпичи, а динамика подразумевают работу с чем-то высокоуровневым из предментной области. Грубо говоря, у тебя WITH будет всегда по какому-нибудь объекту, а в этот объект ты уже можешь положить что угодно, включая массив (и то, скорее всего ты его спрячешь от прямого доступа).


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: ANYARRAY вдобавок к ANYREC
СообщениеДобавлено: 31 дек 2018, 11:21 
Не в сети

Сообщения: 350
> когда это надо
StdLog.Array
> Массивы сами по себе это неинтересные низкоуровневые кирпичи, а динамика подразумевают работу с чем-то высокоуровневым из предментной области.
Это не общепризнано


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: ANYARRAY вдобавок к ANYREC
СообщениеДобавлено: 31 дек 2018, 13:06 
Не в сети

Сообщения: 28
Обобщать, так обобщать.
Код: "OBERON"
  1. PROCEDURE My(VAR x:ANY);
  2. BEGIN
  3. WITH X:INTEGER DO ...
  4. | x: ARRAY OF CHAR DO...
  5. |...
  6.  


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: ANYARRAY вдобавок к ANYREC
СообщениеДобавлено: 31 дек 2018, 13:36 
Не в сети

Сообщения: 350
Насчёт INTEGER вряд ли это будет так просто, т.к. у него нет тега типа. В лиспе, как правило, любой объект знает свой тип, зато размер FIXNUM (аналог INTEGER) - меньше машинного слова на 1-4 бита. Поскольку тег типа в лиспе - это переменное число бит в машинном слове. В ББЦБ, если я правильно понимаю, только Block знает свой тип. Обычная запись и массив - это Block. А вот значения элементарных типов и untagged записей известны только из контекста - из статически известного типа переменной, в которой они хранятся.

Это пока - всего лишь моя гипотеза. Можно ли динамически (зная только адрес) отличить массив от записи? Этого я тоже не знаю. Ключ к тому, чтобы узнать - понять работу Kernel.Mark, или найти описание. Ваши комментарии приветствуются.

Если моя гипотеза верна, то реализация типа ANY выходит за рамки моих наличных временных ресурсов, поэтому я об этом и не пишу :)


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: ANYARRAY вдобавок к ANYREC
СообщениеДобавлено: 31 дек 2018, 18:13 
Не в сети

Сообщения: 108
budden писал(а):
> когда это надо
StdLog.Array


WITH тебе с этим не поможет. Тебе нужна будет полноценная рефлексия + какой-нибудь ANY (как правильно заметил trurl). Можно пообсуждать как втащить это в язык, но оберонщиков вполне устраивает SYSTEM, Kernel и т.п.

budden писал(а):
> Массивы сами по себе это неинтересные низкоуровневые кирпичи, а динамика подразумевают работу с чем-то высокоуровневым из предментной области.
Это не общепризнано


Массив - это структура данных. Есть еще списки, деревья и 100500 других. Для них тоже свой WITH нужен?


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: ANYARRAY вдобавок к ANYREC
СообщениеДобавлено: 01 янв 2019, 16:18 
Не в сети

Сообщения: 350
План по добавлению полиморфизма - здесь:

вече.программирование-по-русски.рф/viewtopic.php?f=2&t=27&p=290#p290

В текущем Kernel и System нет ничего, похожего на ITEM - для ITEM я поменял компилятор.
Хотя, может быть, я просто не знаю, как это сделать, но мне кажется, что этого никто не знает
и сделать так нельзя - я немного почитал, что и как люди пробовали.

Рефлексия для массивов, насколько я понимаю, уже есть, через Meta.Array, хотя я не пробовал
извлекать элементы. В целом про массивы я просто хочу сделать шаг вперёд, да и то не факт,
что хватит ресурсов в близком будущем даже на самое скромное.

Касаемо того, что не русифицированы ключевые слова - это вопрос простоты раскрутки.
Слова можно заменить в любой момент, но тогда этот код не полезет в обычные сборки.
Не хочу такой мороки. Ключевые слова и так все знают, весь вопрос содержится в остальных
идентификаторах, которых на несколько порядков больше.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: ANYARRAY вдобавок к ANYREC
СообщениеДобавлено: 01 янв 2019, 16:31 
Не в сети

Сообщения: 350
> Массив - это структура данных. Есть еще списки, деревья и 100500 других. Для них тоже свой WITH нужен?
С т.з. системы типов оберона (КП), есть только массив и запись как обобщённые составные типы. При этом есть
безопасный способ обращения к любой записи через ANYPTR и WITH, а такого же способа для массивов нету.
Странная аномалия. Как делать и сколько это будет стоить в случае массивов - отдельный вопрос.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: ANYARRAY вдобавок к ANYREC
СообщениеДобавлено: 02 янв 2019, 18:56 
Не в сети

Сообщения: 108
budden писал(а):
> Массив - это структура данных. Есть еще списки, деревья и 100500 других. Для них тоже свой WITH нужен?
С т.з. системы типов оберона (КП), есть только массив и запись как обобщённые составные типы.


Есть еще процедурные типы. Для них тоже WITH?

budden писал(а):
При этом есть безопасный способ обращения к любой записи через ANYPTR и WITH, а такого же способа для массивов нету.
Странная аномалия. Как делать и сколько это будет стоить в случае массивов - отдельный вопрос.


Я переформулирую вопрос: чем это будет лучше традиционной рефлексии на осмысленных примерах? Упомянуый StdLog.Array делать придется все равно на рефлексии...


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club