Как найти пакет класса в lisp?

Предположим, я хочу узнать, в каком пакете определен класс, например. скажем (defclass x ()()) определен в p1. Одним из способов может быть получение пакета через (symbol-package 'x). проблема с этим решением заключается в том, что x экспортируется в другой пакет p2. Любые другие предложения?


person user1222310    schedule 21.02.2012    source источник
comment
классы на самом деле не определены в пакетах. Есть только символы. Имя класса — это символ, но это может быть любой символ. Нет необходимости, чтобы этот символ был из пакета, который был пакетом по умолчанию во время чтения.   -  person Rainer Joswig    schedule 21.02.2012
comment
Вы ... можете опубликовать это как ответ.   -  person Inaimathi    schedule 21.02.2012
comment
в порядке. Я вижу, насколько некорректно поставлен вопрос. Как узнать, в каком пакете появился (загружен или скомпилирован) (defclass x ..)?   -  person user1222310    schedule 22.02.2012


Ответы (1)


Как сказал Райнер Джосвиг, классы не определяются в пакетах; символы имеют пакеты, а имя класса является символом.

Если вы хотите узнать значение *PACKAGE* во время чтения, компиляции или загрузки определения класса (которое, предположительно, может быть тремя разными значениями), я не верю, что есть какой-либо способ получить это, если вы не напишете код для его сохранения в то время.

Кроме того, это не похоже на значимую часть информации. Пакет — это просто пространство имен для символов, и нет причин, по которым пакет, который был текущим на момент чтения, компиляции или загрузки определения класса, должен иметь какое-либо отношение к самому классу.

Однако, если вы действительно хотите, чтобы имя класса x находилось в пакете p1, но p2 экспортирует его, вам может быть интересно добавить x в shadow списка p1 в его defpackage (или после).

person Samuel Edwin Ward    schedule 22.02.2012
comment
Я строю диаграммы классов и извлекаю слоты, методы и специалисты по методам из классов, а также подклассов и суперклассов. Было бы неплохо сгруппировать классы по пакету, в котором они были собраны. Предполагается, что каждый класс определен в файле с соответствующим пакетом, выбранным разработчиком для отражения структуры пакета проекта. Я понимаю, что это может быть не всегда правильно, но все же может быть полезно. Предполагая, что люди изменяют определение класса в том же самом файле, из которого оно было скомпилировано, информация становится значимой. - person user1222310; 23.02.2012
comment
Я бы предположил, что пакет имени класса отражает структуру проекта. В любом случае, они, вероятно, будут одинаковыми большую часть времени. - person Samuel Edwin Ward; 23.02.2012
comment
Вы можете определить метод функции MOP ensure-class, который хранит значение *package* где-то, например, в хеш-таблице. Вам нужно будет сделать это перед загрузкой классов, пакет которых вы хотите узнать. - person Samuel Edwin Ward; 23.02.2012
comment
к сожалению, имена классов не отражают структуру, и я не могу изменить это сейчас. спасибо за комментарии. возможно, мне также следует посмотреть, как слизь переходит к определениям классов. - person user1222310; 23.02.2012
comment
Об этом есть вопрос о переполнении стека, но я не могу его найти. Короткий ответ заключается в том, что слизь (swank) использует функции, специфичные для реализации, чтобы узнать, где что-то определено. - person Samuel Edwin Ward; 23.02.2012