2015-03-06 9 views
8

में उपनाम पैकेज नाम मैं एक परियोजना के लिए आम लिस्प में एक बाहरी पैकेज का उपयोग कर रहा हूं; मैं एक छोटा नाम करने के लिए पैकेज, लेकिन यह अन्य नाम का उपयोग करने के लिए, कैसे Clojure में मैंसामान्य लिस्प

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

आदेश में कर सकता है के लिए इसी तरह संघर्ष नामकरण से बचने के लिए सक्षम होना चाहते हैं, मैं नहीं बल्कि ऐसा नहीं चाहते हैं:

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

(in-package :my-package) 

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

जहां other-packagetake-over-world परिभाषित करता है। मैं तो बस पूर्ण योग्य पैकेज नाम हर बार टाइप कर सकते हैं:

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

(in-package :my-package) 

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

लेकिन मेरे मामले में पैकेज मैं आयात करने कर रहा हूँ एक अनावश्यक रूप से लंबे समय के नाम है। वहाँ एक रास्ता मैं op को यह aliasing द्वारा

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

के रूप में उपयोग कर सकते हैं other-package है? मैं प्रैक्टिकल कॉमन लिस्प में प्रासंगिक अध्याय में ऐसा कुछ नहीं ढूंढ पाया।

उत्तर

11

सामान्य लिस्प पैकेज में उपनाम है।

(defpackage "LONGER-FOO" 
    (:use "CL") 
    (:nicknames "LF")) 
सादा कॉमन लिस्प में

मौजूदा संकुल के लिए उपयोग करें RENAME-PACKAGE:

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

उदाहरण: आप एक पैकेज DEFPACKAGE परिभाषा में एक या अधिक उपनाम दे सकते हैं

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> 

एक समारोह के रूप में:

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

फिर हम कॉल कर सकते हैं:

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