Приколы vl-acad-defun и NET

Известно, что vl-acad-defun позволяет "экспортировать" лисп-функцию для вызова ее из-под arx / net.

На самом деле не только. Она же позволяет "выпустить" функцию из vlx с отдельным именным пространством.

Итак, ситуация:

  1. Есть vlx (в данном конкретном случае с общим именным пространством) с несколькими функциями, для которых выполнен vl-acad-defun. Остальной функционал, который болтается в этом vlx, роли не играет
  2. Есть NET-сборка, которая вызывает эти функции
  3. Есть исходники этих функций, повторно выполняющие vl-acad-defun

Последовательность загрузки проста и незатейлива:

  1. Загрузка NET-сборки
  2. Загрузка vlx
  3. Загрузка исходников

Здесь больше всего интересует загрузка именно vlx и lsp. Поскольку именное пространство не отдельное, повторная загрузка исходника по идее должна "перекрывать" объявление функции внутри vlx. То есть если внутри vlx есть определение some-cool-function, а потом мы загружаем lsp, внутри которого прописано (defun some-cool-funcion() <...>), то при вызове будет срабатывать именно исходник.

Так было, и это было круто. До того момента, пока в игру не вступает vl-acad-defun.

Я не понял причину, но, похоже, при описанной последовательности загрузки определение функции, которое регистрируется из-под vlx (с применением vl-acad-defun), становится "первым и единственным". И именно оно и подхватывается при вызове из NET. Автоматическая загрузка исходника не срабатывает и то ли не регистрирует, то ли неправильно регистрирует функцию.

При этом ручная загрузка исходника lsp с vl-acad-defun прекрасно перерегистрирует функцию, и при вызове из NET срабатывает именно загруженный вручную вариант.

Причину даже не стал выяснять. Нашел костыль для обхода - и пока этого достаточно.

P.S. Еще одна иллюстрация на тему, что не стоит смешивать внутри одного проекта NET и LISP. Но переписывать все проекты никто не даст - нет ни знаний, ни времени :(



Поделитесь своим мнением


Я не робот.