2015-03-06 9 views
8

Używam zewnętrznego pakietu w Common Lisp dla projektu; Chcę, aby móc skorzystać z pakietu, ale alias go do krótszej nazwy, podobnie jak w Clojure mogłem zrobićpseudonimy w Common Lisp

(require '[unnecessarily-long-package-name :as ulpn]) 

w celu uniknięcia konfliktów nazw, to raczej nie to zrobić:

(defpackage #:my-package 
    (:use #:cl #:other-package)) 

(in-package :my-package) 

(take-over-world "pinky" "brain") 

gdzie other-package definiuje take-over-world. może po prostu wpisać pełną kwalifikowaną nazwą pakiet za każdym razem:

(defpackage #:my-package 
    (:use #:cl)) 

(in-package :my-package) 

(other-package:take-over-world "pinky" "brain") 

ale w moim przypadku mam pakiet importowanie ma niepotrzebnie długą nazwę. Czy istnieje sposób mogę korzystać other-package jak

(op:take-over-world "pinky" "brain") 

przez aliasing go op? Nie mogłem znaleźć czegoś takiego w odpowiednim rozdziale w Practical Common Lisp.

Odpowiedz

11

W pakietach Common Lisp mają pseudonimy. Można nadać paczkę jeden lub więcej pseudonimów w definicji DEFPACKAGE:

(defpackage "LONGER-FOO" 
    (:use "CL") 
    (:nicknames "LF")) 

dla istniejących pakietów w postaci zwykłego Common Lisp używają RENAME-PACKAGE:

rename-package package new-name &optional new-nicknames => package-object

Przykład:

CL-USER 1 > (defpackage "LONG-FOO" (:use "CL")) 
#<The LONG-FOO package, 0/16 internal, 0/16 external> 

CL-USER 2 > (let ((package (find-package "LONG-FOO"))) 
       (rename-package package 
           (package-name package) 
           (adjoin "FOO" 
             (package-nicknames package) 
             :test #'string=))) 
#<The LONG-FOO package, 0/16 internal, 0/16 external> 

Jako funkcja:

(defun add-nickname (package nickname) 
    (when (stringp package) 
    (setf package (find-package package))) 
    (check-type package package) 
    (check-type nickname string) 
    (rename-package package (package-name package) 
        (adjoin nickname (package-nicknames package) 
          :test #'string=))) 

Wtedy możemy nazwać:

(add-nickname "LONG-FOO" "BAZ")