调用defpackage和in-package的变化

Mic*_*ald 1 common-lisp identifier

格雷厄姆的书"ANSI Common Lisp"(1996)p.137示出了使用的示例defpackage包在-是这样

(defpackage "MY-APPLICATION"
  (:use "COMMON-LISP" "MY-UTILITIES")
  (:nicknames "APP")
  (:export "WIN" "LOSE" "DRAW"))

(in-package my-application)
Run Code Online (Sandbox Code Playgroud)

defpackage字符串的调用使用传达包名和列表导出符号.虽然这种风格可以在较旧的代码中看到,但今天的主要用途似乎是

(defpackage :my-application
  (:use :common-lisp :my-utilities)
  (:nicknames :app)
  (:export :win :lose :draw))

(in-package :my-application)
Run Code Online (Sandbox Code Playgroud)

:my-applicationdefpackagein-package调用中使用关键字所产生的规律性是一个小但可观的差异.

我推测,第二种形式减少了内存中程序的大小,因为关键字都是在关键字包中实现的,而文字字符串代表它们自己,而具有相同内容的文字字符串不需要共享它们的内存表示.(如果他们这样做了,可以通过改变其中一个字符串来获得奇怪的结果!)

这两种形式之间的实际差异是什么,为什么后者比前者更受欢迎?

除此之外,我偶尔也会看到

;; Pay attention to the :export line
(defpackage :my-application
  (:use :common-lisp :my-utilities)
  (:nicknames :app)
  (:export #:win #:lose #:draw))

(in-package :my-application)
Run Code Online (Sandbox Code Playgroud)

#引入了读者的宏,但我不知道它的影响有一个关键字,不知道如何修改defpackage声明.

sds*_*sds 6

TL;博士

使用未加工的符号,例如#:my-package.

字符串指示符

常见的lisp有一个字符串指示符的概念 (另请参见指示符).

这意味着操作符号 defpackage等同于它们的名称.

使用哪个指示符?

你有4个选择:

1个实习符号

例如,

(defpackage my-package)
Run Code Online (Sandbox Code Playgroud)

优点

简短

坏处

命名空间污染:符号my-package现在 被当中实施 *package*.

2关键字

例如,

(defpackage :my-package)
Run Code Online (Sandbox Code Playgroud)

优点

适度简洁(一个额外的角色)

坏处

命名空间的污染:符号:my-package现在 实习标准package关键字.

3字符串

例如,

(defpackage "MY-PACKAGE")
Run Code Online (Sandbox Code Playgroud)

优点

无命名空间污染.

缺点

  • 丑陋的upcase
  • 2个额外的字符

4未加工的符号

例如,

(defpackage #:my-package)
Run Code Online (Sandbox Code Playgroud)

优点

无命名空间污染.

缺点

2个额外的字符

"丑陋的前缀"实际上是一个理想的功能,因为这是我使用未加密符号的唯一上下文,如果添加,emacs会很好地突出显示它们

(font-lock-add-keywords
 'lisp-mode
 '(("\\(#:\\)\\(\\(\\s_\\|\\sw\\)*\\)"
    (1 font-lock-comment-delimiter-face)
    (2 font-lock-doc-face))))
Run Code Online (Sandbox Code Playgroud)

到你的~/.emacs.

  • @RainerJoswig:哎呀,我没有意识到这是我的定制,我现在解决了这个问题.顺便说一句,恭喜你的代表里程碑;-) (2认同)