2017-07-29 1 views
1

J'ai une fonction foo définie dans un package my-package:Partage des symboles Lisp à travers les paquets

(in-package :my-package) 
(defun foo (a) 
    (if (eql a 'value1) 
    (do-this) 
    (do-the-other))) 

Quand j'appelle cette fonction à partir d'un autre paquet que je dois qualifier le paramètre avec le nom du package:

(in-package :cl-user) 
(my-package:foo 'my-package::value1) 

mais c'est plutôt moche. Je veux partager le symbole value1 avec tous les autres paquets. J'ai trouvé une solution de contournement qui consiste à importer le symbole value1, mais cela ne fonctionne que s'il a déjà été défini dans l'autre paquet. Une autre possibilité est de passer des chaînes, "value1", mais encore une fois, ce n'est qu'un patch. Quel est le meilleur moyen de partager des symboles entre paquets? Merci pour votre aide.

+2

Habituellement, des mots-clés sont utilisés à cette fin. Si vous voulez utiliser des symboles sans mot-clé, exportez simplement (et importez si vous ne voulez pas utiliser le nom qualifié du paquet) le symbole de la même manière que pour tous les autres symboles. – jkiiski

Répondre

4

Utilisez un symbole mot-clé, que vous pouvez toujours écrire sans nommer son emballage keyword:

(foo:bar :value1) 

symboles de mots-clés sont dans le paquet KEYWORD, évaluent eux-mêmes, sont automatiquement exportés et que vous n'avez pas besoin notez le nom du paquet.

Puisqu'un symbole de mot-clé s'évalue à lui-même, vous n'avez même pas à les citer - mais vous le pouvez.

(foo:bar ':value1) 

Alternative: noms de paquets courts

Parfois, il peut être utile d'avoir un symbole dans un emballage spécifique. Ensuite, j'utiliserais un nom de package court, que vous pouvez également définir comme pseudonyme. Voir les options sur DEFPACKAGE. Par exemple le paquet color-graphics pourrait avoir le surnom cg.

Puis on écrirait:

(foo:bar 'cg:green) 

Comme il est un symbole normal, vous devez citer, sinon ce serait une variable.