Common Lisp 中的别名包名称
alias package names in Common Lisp
我正在为项目使用 Common Lisp 中的外部包;我希望能够使用该包,但将其别名为更短的名称,类似于我在 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-package
定义 take-over-world
。我每次都可以输入完整的包名:
(defpackage #:my-package
(:use #:cl))
(in-package :my-package)
(other-package:take-over-world "pinky" "brain")
但在我的例子中,我正在导入的包的名称过长。有什么方法可以将 other-package
用作
(op:take-over-world "pinky" "brain")
将其别名为 op
?我在 Practical Common Lisp 的相关章节中找不到类似的内容。
不直接。我用了 http://www.cliki.net/cl-package-aliases in my CL days, but it's pretty outdated ATM. Though other solutions are listed here https://github.com/avodonosov/local-package-aliases
在标准的 Common Lisp 包中有全局 昵称。您可以在 DEFPACKAGE
定义中给包一个或多个昵称:
(defpackage "LONGER-FOO"
(:use "CL")
(:nicknames "LF"))
对于普通 Common 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>
作为函数:
请注意,我们希望默认保留现有昵称。
(defun add-nickname (package nickname
&key (keep-existing-nicknames-p t))
(when (stringp package)
(setf package (find-package package)))
(check-type package package)
(check-type nickname string)
(rename-package package
(package-name package)
(if keep-existing-nicknames-p
(adjoin nickname (package-nicknames package)
:test #'string=)
(list nickname))))
那么我们可以调用:
(add-nickname "LONG-FOO" "BAZ")
现在(也许从 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")
当 nicknames
是全球时,PLN 现在是 您的 包的本地并且不会污染全球命名空间。
我正在为项目使用 Common Lisp 中的外部包;我希望能够使用该包,但将其别名为更短的名称,类似于我在 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-package
定义 take-over-world
。我每次都可以输入完整的包名:
(defpackage #:my-package
(:use #:cl))
(in-package :my-package)
(other-package:take-over-world "pinky" "brain")
但在我的例子中,我正在导入的包的名称过长。有什么方法可以将 other-package
用作
(op:take-over-world "pinky" "brain")
将其别名为 op
?我在 Practical Common Lisp 的相关章节中找不到类似的内容。
不直接。我用了 http://www.cliki.net/cl-package-aliases in my CL days, but it's pretty outdated ATM. Though other solutions are listed here https://github.com/avodonosov/local-package-aliases
在标准的 Common Lisp 包中有全局 昵称。您可以在 DEFPACKAGE
定义中给包一个或多个昵称:
(defpackage "LONGER-FOO"
(:use "CL")
(:nicknames "LF"))
对于普通 Common 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>
作为函数:
请注意,我们希望默认保留现有昵称。
(defun add-nickname (package nickname
&key (keep-existing-nicknames-p t))
(when (stringp package)
(setf package (find-package package)))
(check-type package package)
(check-type nickname string)
(rename-package package
(package-name package)
(if keep-existing-nicknames-p
(adjoin nickname (package-nicknames package)
:test #'string=)
(list nickname))))
那么我们可以调用:
(add-nickname "LONG-FOO" "BAZ")
现在(也许从 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")
当 nicknames
是全球时,PLN 现在是 您的 包的本地并且不会污染全球命名空间。