Это общий символьный вопрос в определенном контексте. Вопрос, на который мне нужно ответить: заданный параметр, содержащий символ «foo», как мне манипулировать частью пакета символа, чтобы он соответствовал «package: foo?»
Более конкретный контекст: существует пакет для модульного тестирования fiveam, в котором функции теста хранятся в хэш-таблице (it.bese.fiveam::*tests
) с ключами типа package::test-name
, которые хэшируют объект, содержащий тесты. Для запуска теста обычно передают функции run!
символ, который является хеш-ключом: (run! 'package::test-name
. Если я звоню run!
из пакета tests
, в котором я определил тесты, я могу просто C-x C-e на (run! 'test-name)
. При звонке из SLIME REPL я должен сделать (tests::run! 'tests::test-name)
, что вызывает легкие неудобства.
Я бы хотел запустить тесты от cl-user с (run! 'test-name)
и опустить имя пакета. Я думал, что было бы просто обернуть run!
и добавить недостающий пакет к символу, но все мои попытки провалились, я думаю, отчасти потому, что CL-USER:test-name
отличается от tests:test-name
.
В рассматриваемой хеш-таблице eql
используется для проверки равенства. В пакете tests
:
(eql 'tests::foo 'foo) => T
В CL-USER:
(eql 'tests::foo 'foo) => nil
Различные функции могут возвращать символы (например, intern, make-symbol или format-symbol), но ни одна из них не соответствует ключам в хэш-таблице:
(eql (alexandria:format-symbol t "foo::bar") 'foo::bar) => nil
(eql (make-symbol "foo::bar") 'foo::bar) => nil
Извлекая это из контекста SLIME / REPL / FIVEAM, чтобы обобщить, где, на мой взгляд, проблема, я не могу понять, как взять 'bar
и превратить его в 'foo:bar
в качестве символа. Я могу указать это вручную как 'foo:bar
, но я не могу получить что-нибудь для eql 'foo:bar
, учитывая 'bar
.
Примечание: мне не важно набирать несколько дополнительных букв для названия пакета. То, что я действительно пытаюсь сделать здесь, это улучшить мое понимание области видимости и определения символов.
Спасибо.