2016-08-29 3 views
0

System-A und System-B sind Systeme, die mit ASDF hergestellt werden. Beide haben Systemdefinitionen in .asd Dateien und definieren Pakete, :system-a und :system-b, jeweils.Wie: Verwenden von Systemen, die ich mit ASDF erstelle?

Ich möchte System-A zu :use System-B-Paket in seiner Paketdefinition. Ich möchte das, damit ich die Symbole von System-B in System-A verwenden kann, ohne auf das System-B-Paket Bezug zu nehmen. Insbesondere möchte ich symbol statt system-b:symbol verwenden.

Zur Zeit, in System-A-Paket-Definition, versuche ich :use :system-b. Dies funktioniert in Bibliotheken, die ich mit QuickLisp importiert habe, aber nicht für meine eigenen Systeme.

Wie kann ich :use :system-b, so dass ich die Symbole in System-A-Paket intern?

+1

Systeme keine Symbole. Symbole sind in einem Paket interniert. Normalerweise würden Sie ein Paket mit demselben Namen wie das System definieren, das die Symbole exportiert. – jkiiski

+0

Danke, ich habe die Frage geklärt. – audrow

+0

Es sollte keinen Unterschied zwischen der Verwendung Ihrer eigenen Systeme und denen, die mit Quicklisp installiert wurden, geben. Welchen Fehler bekommst du? Können Sie 'SYSTEM-B' laden? – jkiiski

Antwort

0

Hier werde ich die Lösungen zeigen, die ich gefunden habe:


Die erste ist die Symbole in der Paketdefinition zu exportieren. Mit meinem Beispiel im System-B-Paketdefinition

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

Und im System-A Paket Definition

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

Dann, wenn Ihr (in-package :system-a) sind, haben Sie Zugriff auf System B exportierten Symbole.


Zweitens, wenn Sie eine Menge von Symbolen zu exportieren haben (ein Versorgungspaket machen) können Sie folgende verwenden können, gefunden here.

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

Fügen Sie diesen Code einfach ein, nachdem alle Symbole erstellt wurden. Wenn Sie ASDF verwenden, können Sie in Ihrer Systemdefinition die letzte Datei laden, die diese Zeilen enthält, um alle Symbole zu exportieren, ohne sie manuell definieren zu müssen.


Eine dritte Option Symbole zu exportieren ist cl-annot, die unter anderem eine Funktion mit @export Präfix erlaubt es zu exportieren. Zum Beispiel

@export 
(defun foobar() 
    ...) 

entspricht

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

Ich finde 'system-a' als Namen verwirrend für ein Paket. Ein Paket ist kein System. 'Cl-Annot' ist einfach hässlich. Eine andere Idee ist es, eine Variante von defun zu verwenden, die das Symbol exportiert. Aber dann bleibt es ein S-Ausdruck und verwendet keine Reader-Syntax-Erweiterung. Es wäre auch selten, ALLE Symbole eines Pakets zu exportieren, indem Sie darüber iterieren. Es könnte viele Symbole im Paket geben, die nicht zum Exportieren nützlich sind. (defun a() 'b) -> Warum Export b? –

+1

Ich würde nicht 'do-all-symbols' verwenden (das über alle Symbole in allen Paketen iteriert), sondern' do-symbols' (das über die in einem Paket zugänglichen Symbole iteriert). –

+2

'(export (defun foo() ...)) würde auch funktionieren (außer setf-Funktionen). Die meisten 'def-x'-Formulare geben den Namen des Objekts zurück, das definiert wird. – coredump

Verwandte Themen