2015-03-06 12 views
8

Tôi đang sử dụng gói bên ngoài trong Common Lisp cho một dự án; Tôi muốn để có thể sử dụng gói nhưng alias nó vào một tên ngắn hơn, tương tự như cách trong Clojure tôi có thể làmtên gói bí danh trong Common Lisp

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

Để tránh đặt tên xung đột, tôi không muốn làm điều này:

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

(in-package :my-package) 

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

nơi other-package xác định take-over-world. Tôi chỉ có thể nhập tên gói đủ điều kiện mỗi lần:

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

(in-package :my-package) 

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

nhưng trong trường hợp của tôi gói tôi đang nhập có tên dài không cần thiết. Có cách nào tôi có thể sử dụng other-package như

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

bởi răng cưa nó để op? Tôi đã không thể tìm thấy bất cứ điều gì như thế này trong chương có liên quan trong thực tế thường Lisp.

Trả lời

11

Trong các gói Lisp thường có biệt hiệu. Bạn có thể cung cấp một gói một hoặc nhiều nickname trong định nghĩa DEFPACKAGE:

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

Đối với các gói hiện tại đồng bằng Common Lisp sử dụng RENAME-PACKAGE:

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

Ví dụ:

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> 

Là một hàm:

(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=))) 

Sau đó, chúng ta có thể gọi:

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