Тема: LISP.Как вызвать функцию документа из отдельного именного пространства VLX-модуля.
Определяем функцию-посредник в пространстве документа и регистрируем её:
(defun InvokeBroker() (setq InvokeArgsOrReturn (vl-catch-all-apply (function (lambda () (apply (car InvokeArgsOrReturn) (cdr InvokeArgsOrReturn)))))) ); (vl-acad-defun 'InvokeBroker)
VLX-модуль с отдельным именным пространством должен содержать инструкцию импорта:
(vl-arx-import 'InvokeBroker)
и код, создающий функцию-оболочку для удобной работы:
(defun DocumentInvoke (subr args) (vl-doc-set 'InvokeArgsOrReturn (cons subr args)) (InvokeBroker) (vl-catch-all-apply 'vl-doc-ref (list 'InvokeArgsOrReturn)) );
Вот и всё.
*** Пример вызова функции, определенной в пространстве документа, из VLX-модуля с отдельным именным пространством ***
Форма вызова полностью совпадает с вызовом стандартной AutoLISP-функции apply:
(setq res (DocumentInvoke 'somefun (list arg1 arg2)))
где somefun - определенная с помощью defun функция пространства документа, получающая два аргумента.
В переменную res будет помещено возвращаемое значение функции somefun.
Предложенная техника позволяет передавать в функцию документа в качестве аргументов и возвращать из неё
в именное пространство VLX-модуля практически любые используемые в VisualLISP типы данных, кроме переменных,
тип которых определяется, как USUBR, SUBR и EXRXSUBR.
Функция DocumentInvoke не генерирует исключений. В случае ошибки в имени вызываемой функции, в количестве или типах
передаваемых аргументов, или в случае каких-либо непредвиденных исключений внутри вызываемой функции
возвращает объект #<%catch-all-apply-error%>.