gpt4 book ai didi

common-lisp - defpackage 和 in-package 调用的变化

转载 作者:行者123 更新时间:2023-12-05 08:41:52 24 4
gpt4 key购买 nike

在 Graham 的书“ANSI Common Lisp”(1996 年)p. 137 说明defpackagein-package 用法的示例

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

(in-package my-application)

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

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

(in-package :my-application)

defpackagein-package 调用中使用 :my-application 关键字的规律性很小,但明显的差异。

我推测,第二种形式减少了程序在内存中的大小,因为关键字都驻留在 keyword 包中,而文字字符串代表它们自己,并且内容相同的文字字符串不需要共享他们的内存表示。 (如果他们这样做了,改变其中一个字符串可能会产生奇怪的结果!)

这两种形式之间的实际区别是什么,为什么后者优于前者?

除此之外,我偶尔会看到

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

(in-package :my-application)

# 引入了一个阅读器宏,但我不确定它对关键字有什么影响,也不确定它如何修改 defpackage 声明。

最佳答案

tl;dr

使用 uninterned 符号,如 #:my-package

字符串指示符

Common lisp 有一个 stringdesignator 的概念(另请参见 designators)。

这意味着在操作符号 defpackage相当于他们的名字。

使用哪个指示符?

您有 4 个选项:

1 个内部符号

例如,

(defpackage my-package)

优势

简洁

缺点

命名空间污染:符号 my-package 现在是 interned在当前 *package* .

2 关键字

例如,

(defpackage :my-package)

优势

适度简洁(多一个字符)

缺点

命名空间污染:符号 :my-package 现在是 internedstandard packageKEYWORD .

3 字符串

例如,

(defpackage "MY-PACKAGE")

优势

没有 namespace 污染。

缺点

  • 丑陋的大写
  • 2 个额外字符

4 Uninterned 符号

例如,

(defpackage #:my-package)

优势

没有 namespace 污染。

缺点

2个额外的字符

“丑陋的前缀”实际上是一个理想的特性,因为这是我唯一使用非内部符号的上下文,如果你添加,emacs 会很好地突出显示它们

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

到你的~/.emacs

关于common-lisp - defpackage 和 in-package 调用的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46981477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com