Пакеты Common Lisp — как справиться, когда пакет может быть не загружен?

#package #common-lisp

#пакет #common-lisp

Вопрос:

Предположим, что пользователь библиотеки common lisp мог также загрузить пакет A, пакет B или ни один. Я хочу иметь возможность принимать объекты из любого пакета. В идеале это был бы просто случай определения метода для этих объектов. Однако, если пакеты не загружены во время компиляции, попытка сделать это приведет к появлению ошибки Package XYZ does not exist . Я не хочу заставлять пользователей загружать оба пакета, поэтому есть какие-либо предложения о том, как я могу выполнять условные вызовы во время выполнения?

Ответ №1:

Вы могли бы сделать что-то похожее на следующее:

 (defun foo (x)
   (cond
      ((find-package :bar) (funcall (find-symbol "x" :bar) x))
      ((find-package :baz) (funcall (find-symbol "y" :baz) x))))
  

В принципе, используйте find-package и find-symbol , чтобы проверить, существует ли пакет, и получить символ из пакета, если он существует. Затем вы можете использовать symbol-function и symbol-value для получения функции или значения, связанного с символом. В моем примере funcall автоматически выполняется поиск функции, связанной с символом, возвращаемым find-symbol , поэтому symbol-function в этом не было необходимости.

Комментарии:

1. Спасибо. Единственное изменение, которое мне пришлось внести, это то, что строки «x» и «y» в вашем примере должны быть в верхнем регистре.