Сейчас я наверняка по невежеству какой-нибудь бред сделаю. Но я хочу функцию S, которая для любого аргумента возвращает его строковое представление.
Только давайте сразу не будем тратить время на терминологические дискуссии. Я хочу функцию, подобную ENTIER или LONG, которая записывается одинаково, но принимает аргументы разных типов (не обязательно записи). Такую функцию можно назвать перегруженной, ad-hoc полиморфной, обобщённой, да хоть пирогом назвать. Главное, чтобы все понимали, о чём речь. Как её называть правильно - я не хочу обсуждать, т.к. это, во многом, вопрос клановой принадлежности.
По идее, если есть добровольцы, то можно этим заняться. Если нет, то я сейчас буду делать разведку, а потом попробую найти исполнителя за деньги. Такая функция нужна для REPL (цчвп).
По сути есть два подхода:
а) смотреть, как сделаны другие полиморфные функции.
В BlackBoxComponentBuilder уже есть полиморфные функции. Экзотическая среди них - ENTIER, которая вызывает примитив entierfn. Её хорошо изучать, т.к. она встречается в малом количестве мест. Ищем в исходниках и находим вот что:
Код: "OBERON"
MODULE DevCPB;
...
entierfn = 5; (* задаётся код функции *)
...
(** видимо, это - кусок компилятора *)
| entierfn: (*ENTIER*)
IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126)
ELSIF f IN realSet THEN Convert(x, DevCPT.int64typ)
ELSE err(111)
END ;
x.typ := DevCPT.int64typ
Код: "OBERON"
MODULE DevCPT;
...
(* DRY заплакал - пусть плачет *)
entierfn = 5;
...
(** это похоже на регистрацию функции как известной компилятору *)
EnterProc("ENTIER", entierfn);
Вот и всё. Пока неясно, легко ли сделать функцию S из этого.
Вот нашёл баг (или не баг) про это:
https://github.com/Oleg-N-Cher/OfrontPlus/issues/43 - ENTIER(ЛитералЧисла) всегда LONG.
Также нашёл описание компилятора, правда, там негусто.
http://obertone.ru/bb/dev/cpt