#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» в вашем примере должны быть в верхнем регистре.