С Routine вряд ли чего выйдет. А вот процедуры можно вызывать по адресу, составить таблицу "имя процедуры-адрес процедуры", в таблице находить адрес - и вызывать. Особенно полезно для реализации всяких плагинов, аддонов и прочее
Кусок из реальной программы
Я хочу по адресу вызывать процедуру типа
procedure(string)
Сначала описал её тип.
Потом написал вызывалку этой процедуры
Код: Выделить всё
CallProc PROCEDURE(StrProc P,String S) !Вызов процедуры по адресу
P(S)
RETURN
Потом в map включил "двойника"
Код: Выделить всё
CallStrProc(Long,String),Name('CALLPROC@F7STRPROCSB')
Волшебное имя справа можно подсмотреть с map-файле, например.
Или найти в Examples\Src\Pro2exp программу, которая поможет
Теперь CallProc и CallStrProc - одна и та же программа, но CallStrProc принимает в качестве первого параметра адрес процедуры.
Ну а дальше всё просто
Код: Выделить всё
ProcQ Queue, Pre(ProcQ)
Addr Long
id Cstring(10)
End
...
Регистрим процедуры
Код: Выделить всё
ProcQ.Id = 'a1'; ProcQ:addr = Address(a1) ; Add(ProcQ)
ProcQ.Id = 'a2'; ProcQ:addr = Address(a2) ; Add(ProcQ)
ProcQ.Id = 'a3'; ProcQ:addr = Address(a3) ; Add(ProcQ)
...
И вызываем
Код: Выделить всё
ProcQ.id = 'a1'; get(ProcQ,+ProcQ:Id); CallStrProc(ProcQ.Addr, ....)
Есть и более простой способ реализации - по Over наложить адрес и ссылку на процедуру, но мне так кажется яснее.