Требуется склонировать основное хранилище
https://osdn.net/projects/referencing/scm/hg/Referencing/
Поменять в gpr ключ -gnat12 на -gnat95 и добиться, чтоб тестовый пример собирался. Я делал на GNAT GPL 2017. Если собранный другой GNAT поддерживает -gnat95, сойдёт.
Я думал сам это сделать, чтоб начало положить, но не вывожу никак, рубит после китайского намертво, так и не довёл до конца.
Должен собираться и запускаться проект Referencing_Tester.gpr
Пока я пытался портировать, я столкнулся со следующим:
Limited_Reference — всё, что так называется, делается просто Reference. «subtype Limited_Reference is Reference;»
Limited_Reference принуждает не делать лишние копирования. В Delphi Result для больших объектов сразу по месту назначения выделяется, а в языке Ада, даже если написать return-do-end-return, компилятор временную переменную заводит, и только limited даёт возможность вкрутить ему мозги. В другом проекте, где контейнеры портируются, я делаю Ada 2012-подобый Ada 95-совместимый аналог, но в данном случае смысла в этой затее не увидел.
Limited_Reference в проекте используется в паре с Move. Move требует доступ на запись ко второму параметру. Все функции написаны так, что возвращают Limited_Reference. Возвращаемый Limited_Reference доступен только на чтение, но механизмы Ada 2012 приводят его к доступному на запись Reference, и Move работает. Чем-то это похоже на «&&» и семантику копирования в C++. Если же для Ada 95 объявлено «subtype Limited_Reference is Reference;», то Move такое не может пережевать. Надо заменять Move на Assign, где ругается. Ещё в Referencing.Tester.Main.adb есть строчки с объявлениями «… renames …», и компилятор в режиме Ada 95 на них жалуется. Там надо renames заменить на «… := …».
В версии Ada 95 нет записи методов через точку, поэтому X.Move (Y) и X.Assign (Y) надо переписывать на Move (X, Y) и Assign (X, Y), а поскольку Move меньше, где работает, то часть Move становится Assign.
Аспекты Pure и Preelaborate переделываются в pragma. Аналогично Inline_Always. overriding убирается. В одном месте процедуры стали dispatching, там Inline_Always надо заменить на Inline. Функция Release берёт параметр in out, что в Ada 95 не допускается. Надо переделать в процедуру с out параметром.
private with заменяется простым with.
Это всё, что я успел увидеть, пока занимался этим вопросом.
Перед фиксацией в https://osdn.net/projects/referencing/scm/hg/Referencing/ установить новую именованную ветку ada-95
В default там пусть остаётся Ada 2012 версия. Я, может, потом сведу ветки вместе, но в разных директориях, и когда видно будет, что насколько разъезжается.
Как получится на GNAT, можно переносить на AdaMagic.
Но, наверное, лучше файлы в хранилище Experiments скопировать и коммитить в Experiments, а не в Referencing.
Там система сборки, правда, нетривиальная. В Referencing для GNAT тестовый пример добавляет крючки на события копирования и освобождения, а в просто Referencing.gpr (как библиотека) этих крючков нет. Хоть как-нибудь для начала нужно запустить эту штуку.
Чтобы получать по почте уведомления о новых темах, на раздел форума нужно подписаться здесь