LINUX.ORG.RU

я так понимаю, при помощи (intern ... *package*)

bugmaker ★★★★☆
()

если я вообще правильно понял желаемое.

(in-package :test)

(defun a () (intern (symbol-name 'b) *package*))

(in-package :untest)

(test::a) # <--- должно вернуть untest::b aka просто b

bugmaker ★★★★☆
()
Ответ на: комментарий от bugmaker

Если бы b был атом то проблем бы не было, но b нужен как список (на самом деле большой и сложный список :( )

catap ★★★★★
() автор топика
Ответ на: комментарий от catap

Объясни поподробнее, иначе не пойму. Список не находится в пространстве имён пакета, значит сам список возвращается как есть. В нём чтоли есть символы? Символы обязаны находиться в пространстве имён пакета, "просто" символов не бываед. Чтобы они принадлежали именно целевому пакету, нужно

Либо формировать список сразу в нужной форме, например

(in-package :src)

(defun a () '(1 2 dst::sym))

(in-package :dst)

(src::a) # <-- возвратит (1 2 sym)

(in-package :no-dst)

(src::a) # <-- возвратит (1 2 dst::sym)

Это годится только если символы результата будут юзаться в одном пакете, и заранее извесно каком.

Либо отмапить список с символами в нужный пакет, при помощи (lambda (x) (if (symbolp x) (intern (symbol-name x) *package*) x)

Хотя ИМХО ты пытаешся сделать чёто плохое и правильнее было бы реорганизовать данные так, чтобы такого не требовалось. Например отмиррорить все потенциально возможные (будет потеря производительности) либо изначально хранить их в определённом пакете, что на мой взгляд предпочтительно.

bugmaker ★★★★☆
()

Возвращать как кейворд, т.е. (defun a '(:b)). Все символы, которые начинаются с : попадают в пакет keyword, т.е. (eq :b keyword:b) => t.

Это наиболее близко к "просто" символам.

kpanic ★★
()
Ответ на: комментарий от bugmaker

Не, тут проблема не в дизайне.

intern + symbol-name, это конечно метод, но как-то не гуманно.

Я думал есть методы поизящнее.

catap ★★★★★
() автор топика
Ответ на: комментарий от catap

> Спасибо, но я прекрасно знаю что такое пакет и с чем их кушать надо :(

Тогда в чём проблема объяснить пакету-поставщику списка из какого пакета символы в этом списке ты желаешь получить? :)

P.S. Может раскроешь задачу "уровнем выше"? Тогда, возможно, и более изящные решения найдутся :)

yyk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.