Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
ANYARRAY вдобавок к ANYREC https://zx.oberon.org/forum/viewtopic.php?f=2&t=453 |
Страница 1 из 2 |
Автор: | budden [ 31 дек 2018, 00:06 ] |
Заголовок сообщения: | ANYARRAY вдобавок к ANYREC |
Среда времени выполнения blackboxcomponentbuilder знает о массивах всё: размерности и тип элементов. Но пользователю эта информация недоступна. Для общности следовало бы иметь аналог WITH для массивов. Понятно, почему этого нет, но раз мы хотим ввести динамическую типизацию, теперь придётся это сделать. Пока что не хотим морочиться с отдельным типом - пусть типом будет блок. Потом нужно будет завести ANYARRAY. Нужен примерно такой набор функций: Код: "OBERON"
Как сделать аналог WITH - в такое время суток не придумать. Вероятно, WITH должен быть двух уровней. Первый уровень диспетчеризует по типу элемента, второй - по числу измерений. |
Автор: | Comdiv [ 31 дек 2018, 01:23 ] |
Заголовок сообщения: | Re: ANYARRAY вдобавок к ANYREC |
В Обероне массив N-й размерности - это всего лишь массив 1-й размерности массивов (N-1) размерности |
Автор: | vlad [ 31 дек 2018, 08:43 ] |
Заголовок сообщения: | Re: ANYARRAY вдобавок к ANYREC |
budden писал(а): Для общности следовало бы иметь аналог WITH для массивов. А кроме "общности" - можно придумать хоть какой-то осмысленный пример когда это надо? Массивы сами по себе это неинтересные низкоуровневые кирпичи, а динамика подразумевают работу с чем-то высокоуровневым из предментной области. Грубо говоря, у тебя WITH будет всегда по какому-нибудь объекту, а в этот объект ты уже можешь положить что угодно, включая массив (и то, скорее всего ты его спрячешь от прямого доступа). |
Автор: | budden [ 31 дек 2018, 11:21 ] |
Заголовок сообщения: | Re: ANYARRAY вдобавок к ANYREC |
> когда это надо StdLog.Array > Массивы сами по себе это неинтересные низкоуровневые кирпичи, а динамика подразумевают работу с чем-то высокоуровневым из предментной области. Это не общепризнано |
Автор: | trurl [ 31 дек 2018, 13:06 ] |
Заголовок сообщения: | Re: ANYARRAY вдобавок к ANYREC |
Обобщать, так обобщать. Код: "OBERON"
|
Автор: | budden [ 31 дек 2018, 13:36 ] |
Заголовок сообщения: | Re: ANYARRAY вдобавок к ANYREC |
Насчёт INTEGER вряд ли это будет так просто, т.к. у него нет тега типа. В лиспе, как правило, любой объект знает свой тип, зато размер FIXNUM (аналог INTEGER) - меньше машинного слова на 1-4 бита. Поскольку тег типа в лиспе - это переменное число бит в машинном слове. В ББЦБ, если я правильно понимаю, только Block знает свой тип. Обычная запись и массив - это Block. А вот значения элементарных типов и untagged записей известны только из контекста - из статически известного типа переменной, в которой они хранятся. Это пока - всего лишь моя гипотеза. Можно ли динамически (зная только адрес) отличить массив от записи? Этого я тоже не знаю. Ключ к тому, чтобы узнать - понять работу Kernel.Mark, или найти описание. Ваши комментарии приветствуются. Если моя гипотеза верна, то реализация типа ANY выходит за рамки моих наличных временных ресурсов, поэтому я об этом и не пишу ![]() |
Автор: | vlad [ 31 дек 2018, 18:13 ] |
Заголовок сообщения: | Re: ANYARRAY вдобавок к ANYREC |
budden писал(а): > когда это надо StdLog.Array WITH тебе с этим не поможет. Тебе нужна будет полноценная рефлексия + какой-нибудь ANY (как правильно заметил trurl). Можно пообсуждать как втащить это в язык, но оберонщиков вполне устраивает SYSTEM, Kernel и т.п. budden писал(а): > Массивы сами по себе это неинтересные низкоуровневые кирпичи, а динамика подразумевают работу с чем-то высокоуровневым из предментной области. Это не общепризнано Массив - это структура данных. Есть еще списки, деревья и 100500 других. Для них тоже свой WITH нужен? |
Автор: | budden [ 01 янв 2019, 16:18 ] |
Заголовок сообщения: | Re: ANYARRAY вдобавок к ANYREC |
План по добавлению полиморфизма - здесь: вече.программирование-по-русски.рф/viewtopic.php?f=2&t=27&p=290#p290 В текущем Kernel и System нет ничего, похожего на ITEM - для ITEM я поменял компилятор. Хотя, может быть, я просто не знаю, как это сделать, но мне кажется, что этого никто не знает и сделать так нельзя - я немного почитал, что и как люди пробовали. Рефлексия для массивов, насколько я понимаю, уже есть, через Meta.Array, хотя я не пробовал извлекать элементы. В целом про массивы я просто хочу сделать шаг вперёд, да и то не факт, что хватит ресурсов в близком будущем даже на самое скромное. Касаемо того, что не русифицированы ключевые слова - это вопрос простоты раскрутки. Слова можно заменить в любой момент, но тогда этот код не полезет в обычные сборки. Не хочу такой мороки. Ключевые слова и так все знают, весь вопрос содержится в остальных идентификаторах, которых на несколько порядков больше. |
Автор: | budden [ 01 янв 2019, 16:31 ] |
Заголовок сообщения: | Re: ANYARRAY вдобавок к ANYREC |
> Массив - это структура данных. Есть еще списки, деревья и 100500 других. Для них тоже свой WITH нужен? С т.з. системы типов оберона (КП), есть только массив и запись как обобщённые составные типы. При этом есть безопасный способ обращения к любой записи через ANYPTR и WITH, а такого же способа для массивов нету. Странная аномалия. Как делать и сколько это будет стоить в случае массивов - отдельный вопрос. |
Автор: | vlad [ 02 янв 2019, 18:56 ] |
Заголовок сообщения: | Re: ANYARRAY вдобавок к ANYREC |
budden писал(а): > Массив - это структура данных. Есть еще списки, деревья и 100500 других. Для них тоже свой WITH нужен? С т.з. системы типов оберона (КП), есть только массив и запись как обобщённые составные типы. Есть еще процедурные типы. Для них тоже WITH? budden писал(а): При этом есть безопасный способ обращения к любой записи через ANYPTR и WITH, а такого же способа для массивов нету. Странная аномалия. Как делать и сколько это будет стоить в случае массивов - отдельный вопрос. Я переформулирую вопрос: чем это будет лучше традиционной рефлексии на осмысленных примерах? Упомянуый StdLog.Array делать придется все равно на рефлексии... |
Страница 1 из 2 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |