Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
создаём свои ad-hoc полиморфные или же перегруженные функции https://zx.oberon.org/forum/viewtopic.php?f=2&t=415 |
Страница 1 из 3 |
Автор: | budden [ 05 окт 2018, 21:52 ] |
Заголовок сообщения: | создаём свои ad-hoc полиморфные или же перегруженные функции |
Сейчас я наверняка по невежеству какой-нибудь бред сделаю. Но я хочу функцию S, которая для любого аргумента возвращает его строковое представление. Только давайте сразу не будем тратить время на терминологические дискуссии. Я хочу функцию, подобную ENTIER или LONG, которая записывается одинаково, но принимает аргументы разных типов (не обязательно записи). Такую функцию можно назвать перегруженной, ad-hoc полиморфной, обобщённой, да хоть пирогом назвать. Главное, чтобы все понимали, о чём речь. Как её называть правильно - я не хочу обсуждать, т.к. это, во многом, вопрос клановой принадлежности. По идее, если есть добровольцы, то можно этим заняться. Если нет, то я сейчас буду делать разведку, а потом попробую найти исполнителя за деньги. Такая функция нужна для REPL (цчвп). По сути есть два подхода: а) смотреть, как сделаны другие полиморфные функции. В BlackBoxComponentBuilder уже есть полиморфные функции. Экзотическая среди них - ENTIER, которая вызывает примитив entierfn. Её хорошо изучать, т.к. она встречается в малом количестве мест. Ищем в исходниках и находим вот что: Код: "OBERON"
Код: "OBERON"
Вот и всё. Пока неясно, легко ли сделать функцию S из этого. Вот нашёл баг (или не баг) про это: https://github.com/Oleg-N-Cher/OfrontPlus/issues/43 - ENTIER(ЛитералЧисла) всегда LONG. Также нашёл описание компилятора, правда, там негусто. http://obertone.ru/bb/dev/cpt |
Автор: | budden [ 05 окт 2018, 22:01 ] |
Заголовок сообщения: | Re: создаём свои ad-hoc полиморфные или же перегруженные функции |
Второй вариант: DevDebug умеет структурно показывать любую переменную, значит, он содержит нечто, достаточное для реализации функции S. Попробуем порыться. Код: "OBERON"
|
Автор: | budden [ 05 окт 2018, 22:09 ] |
Заголовок сообщения: | Re: создаём свои ad-hoc полиморфные или же перегруженные функции |
Где используется ShowVar? StdDebug.ShowStack , DevDebug.ShowStack, DevDebug.ShowGlobals, DevRtDebug.ShowStack, DevRTDebug.ShowGlobals, DevTypeLibs.ShowLibrary Уффф. Теперь надо разбираться, можно ли вызвать какую-то функцию отладчика из самого кода, не из обработчика Trap и не из отладчика. И как это сделать (параметров очень много). |
Автор: | budden [ 05 окт 2018, 22:13 ] |
Заголовок сообщения: | Re: создаём свои ad-hoc полиморфные или же перегруженные функции |
Теперь РТФМ. Заказные сбои. Вот что нам должно помочь. Хотя, может быть, полазить просто в ObxTrap.Do* ? Ну, недаром ящик чёрный. 13 и 777. ХОрошо хоть, не 666 (или это такой тонкий намёк, но прямо написать постеснялись?) Код: "OBERON"
так вызовем Trap. А где же обработчик? Он явно должен вызывать ShowStack. Этот, наверно: StdDebug.Trap? И ещё вот что: Kernel.InstallTrapViewer(Trap) |
Автор: | budden [ 05 окт 2018, 23:45 ] |
Заголовок сообщения: | Re: создаём свои ad-hoc полиморфные или же перегруженные функции |
Естественно, наивное Код: "OBERON"
не сработало. Видимо, нужна какая-то ф-я, которая имитирует trap и проставляет осмысленные значения для переменных типа Kernel.fp. Подобная TrapHandler. Может быть, есть обработчики каких-то других прерываний. из которых можно взять эту инфу. Но это всё - не то. Потому что S(2 + 2) имеет дело не с переменной, а с выражением. Это нужно решать на уровне компилятора, и только простыню с развязкой по типам нужно брать из ShowVar. |
Автор: | budden [ 05 окт 2018, 23:47 ] |
Заголовок сообщения: | Re: создаём свои ad-hoc полиморфные или же перегруженные функции |
Итог темы на данный момент - придётся завести тему в "коммерческом использовании ". Или ещё покопаться. На самом деле, совершенно некогда. То, что я сейчас покопался - преступление против работодателей и семьи... |
Автор: | ivan_denisov [ 08 окт 2018, 15:11 ] |
Заголовок сообщения: | Re: создаём свои ad-hoc полиморфные или же перегруженные функции |
Бандит, пару часов покопался в Блэкбоксе. Да это же настоящее успокоение души Должно же быть место в жизни для хобби. |
Автор: | budden [ 12 окт 2018, 11:26 ] |
Заголовок сообщения: | Re: создаём свои ad-hoc полиморфные или же перегруженные функции |
Но мне кажется, что я в полном тупике насчёт массивов. Для встроенных типов можно определить эн записей. А что делать с ARRAY OF T для произвольного T? В принципе-то, ситуация такая: Код: "OBERON"
Для печати мы можем сделать именно полиморфную функцию, которая читает экземпляр Типчик и превращает его в строку. Но вот записать типчик в Варвар я не вижу как. Потому что нужная для него запись должна быть где-то определена как: Код: "OBERON"
Здесь мы не обойдёмся никаким обобщённым Код: "OBERON"
Ввиду несуществования типа ANYARRAY. И чё делать теперь? |
Автор: | budden [ 12 окт 2018, 12:30 ] |
Заголовок сообщения: | Re: создаём свои ad-hoc полиморфные или же перегруженные функции |
Можно, конечно, не отступать от изначальной цели. А цель у нас - не варианты, а полиморфные функции. Но на самом деле варианты тоже хочется. |
Автор: | budden [ 12 окт 2018, 17:55 ] |
Заголовок сообщения: | Re: создаём свои ad-hoc полиморфные или же перегруженные функции |
Пока что вот до чего докопался на тему полиморфизма и массивов - русская документация на модуль Kernel, тип Block: Код: "OBERON"
Цитата: Поле tag располагается по смещению -4 от указателя на динамический объект. Для объектов-записей тег хранит адрес описателя типа Kernel.Type. Для объектов-массивов тег хранит адрес описателя базового элемента (для элементарных типов в ядре объявлены псевдоописатели, имеющие идентичный размер), к которому прибавляется бит {1} (т.е. выполняется побитовый OR с числом 2). Поскольку адреса описателей выровнены по смещению 4 и более байт, такая метка позволяет однозначно идентифицировать в памяти динамический объект, являющийся массивом. Похоже, из этого следует, что можно создать тип ANYARRAY и даже ANYARRAY_OR_ANYREC. Единственное, мне тут не понравилось слово "динамического". Поскольку объект в теории (не знаю, как в ББЦБ) может быть размещён статически и на стеке, то это ещё не вся картина. Можно было бы попробовать положиться на сборщик мусора для анализа структуры кучи, но он консервативный, а значит, и он знает о памяти не всё, что нужно. Видимо, эта информация откроется не раньше, чем будет полностью понятен формат стека и структура "статической" памяти, если таковая есть. Комбинируя статическую и динамическую информацию о типе, наверное, так можно создать и искомый вариант, только уж жить в эту пору прекрасную... |
Страница 1 из 3 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |