2016-08-29 2 views
0

Системы-A и System-B - это системы, созданные с использованием ASDF. Они оба имеют определения системы в файлах .asd и определяют пакеты, :system-a и :system-b, соответственно.Практическое руководство. Использование систем, которые я создаю с помощью ASDF?

Я хочу, чтобы System-A был :use Пакет System-B в свою корзину. Я хочу, чтобы я мог использовать символы System-B в System-A, не обращаясь к пакету System-B. В частности, я хочу использовать symbol, а не system-b:symbol.

В настоящее время в определении пакета System-A я пытаюсь использовать :use :system-b. Это работает с библиотеками-экземплярами, которые я импортировал с помощью QuickLisp, но не для моих собственных систем.

Как я могу :use :system-b, чтобы я ставил символы в пакете System-A?

+1

системы не имеют символов. Символы интернированы в пакет. Обычно вы определяете пакет с тем же именем, что и система, которая экспортирует символы. – jkiiski

+0

Спасибо, я уточнил вопрос. – audrow

+0

Не должно быть разницы между использованием ваших собственных систем и устройствами, установленными с Quicklisp. Какую ошибку вы получаете? Можете ли вы загрузить 'SYSTEM-B' ok? – jkiiski

ответ

0

Здесь я покажу решения я нашел:


Первый экспортировать символы в определении пакета. Используя мой пример, в определении пакета System-Б

(defpackage :system-b 
    (:use :cl) 
    (:export :symbol1 
      :symbol2 
      ...)) 

И в определении пакета System-A

(defpackage :system-a 
    (:use :cl 
     :system-b)) 

Тогда, когда ваш (in-package :system-a) у вас есть доступ к экспортируемым символам System-B.


Во-вторых, если у вас есть много символов для экспорта (создание пакета утилит), вы можете использовать следующие, нашел here.

(let ((package (find-package :foo))) 
    (do-all-symbols (symbol package) 
    (when (eql (symbol-package symbol) package) 
     (export symbol)))) 

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


Третий вариант экспорта символов является cl-annot, которая, среди прочего, позволяет префикс функции с @export экспортировать его. Например,

@export 
(defun foobar() 
    ...) 

эквивалентно

(progn 
    (export 'foobar) 
    (defun foobar() 
    ...)) 
+2

Я нахожу 'system-a' как имя, запутанное для пакета. Пакет не является системой. 'cl-annot' является довольно уродливым. Другая идея - использовать какой-то вариант defun, который экспортирует символ. Но тогда он остается s-выражением и не использует расширение синтаксиса читателя. Также было бы редко экспортировать ВСЕ символы пакета, итерации по нему. В пакете может быть много символов, которые нецелесообразно экспортировать. (defun a() 'b) -> зачем экспортировать b? –

+1

Я бы не использовал 'do-all-symbols' (который итерации по всем символам во всех пакетах), а' do-symbols' (который итерации над символами, доступными в пакете). –

+2

'(export (defun foo() ...))' тоже будет работать (кроме функций setf). Большинство форм 'def-x' возвращают имя определяемой вещи. – coredump

Смежные вопросы