Common Lisp中的别名包名称

kor*_*rok 11 clojure common-lisp

我在Common Lisp中使用外部包进行项目; 我希望能够使用该软件包,但将其别名为一个较短的名称,类似于我可以做的Clojure

(require '[unnecessarily-long-package-name :as ulpn])
Run Code Online (Sandbox Code Playgroud)

为了避免命名冲突,我宁愿不这样做:

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

(in-package :my-package)

(take-over-world "pinky" "brain")
Run Code Online (Sandbox Code Playgroud)

在哪里other-package定义take-over-world.我每次都可以输入完整的合格包名称:

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

(in-package :my-package)

(other-package:take-over-world "pinky" "brain")
Run Code Online (Sandbox Code Playgroud)

但在我的情况下,我导入的包有一个不必要的长名称.有没有办法可以other-package用作

(op:take-over-world "pinky" "brain")
Run Code Online (Sandbox Code Playgroud)

通过别名来op?在Practical Common Lisp的相关章节中,我无法找到类似的内容.

Rai*_*wig 15

在Common Lisp包中有昵称.您可以在DEFPACKAGE定义中为包提供一个或多个昵称:

(defpackage "LONGER-FOO"
  (:use "CL")
  (:nicknames "LF"))
Run Code Online (Sandbox Code Playgroud)

对于普通Lisp中的现有包,请使用RENAME-PACKAGE:

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

示例:

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>
Run Code Online (Sandbox Code Playgroud)

作为一个功能:

(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=)))
Run Code Online (Sandbox Code Playgroud)

然后我们可以打电话:

(add-nickname "LONG-FOO" "BAZ")
Run Code Online (Sandbox Code Playgroud)

  • 然而,简短的答案是不正确的,因为它删除了现有的昵称。 (3认同)

Ehv*_*nce 5

现在(可能从 2018 年开始?)的方法是使用包本地昵称 (PLN),现在在大多数实现中都可用。

(defpackage :mypackage
  (:use :cl)
  (:local-nicknames (:nickname :original-package-name)
                    (:alex :alexandria)
                    (:re :cl-ppcre)))

(in-package :mypackage)

;; You can use :nickname instead of :original-package-name
(nickname:some-function "a" "b")
Run Code Online (Sandbox Code Playgroud)

什么时候nicknames是全局的,PLN 现在是你的包本地的,不会污染全局命名空间。