- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Graham 的书“ANSI Common Lisp”(1996 年)p. 137 说明defpackage 和in-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)
在 defpackage 和 in-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 声明。
最佳答案
使用 uninterned 符号,如 #:my-package
。
Common lisp 有一个 stringdesignator 的概念(另请参见 designators)。
这意味着在操作符号 defpackage
相当于他们的名字。
您有 4 个选项:
例如,
(defpackage my-package)
简洁
命名空间污染:符号 my-package
现在是 interned在当前 *package*
.
例如,
(defpackage :my-package)
适度简洁(多一个字符)
命名空间污染:符号 :my-package
现在是 interned在standard packageKEYWORD .
例如,
(defpackage "MY-PACKAGE")
没有 namespace 污染。
例如,
(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/
所以我正在使用 Project Euler 练习 lisp,并且我正在将一些实用函数收集到一个单独的文件中以减少重复,并且我预计它可能会变得相当大,所以我继续进行包定义。这是该文件的精简版本,仍然说明
在 Graham 的书“ANSI Common Lisp”(1996 年)p. 137 说明defpackage 和in-package 用法的示例 (defpackage "MY-APPLICATI
我已经使用 asdf 定义了一个通用的 lisp 包,它同时使用了 parenscript 和 clsql。 但是这些包在函数 GET-TIME 周围存在命名冲突。加载模块时,我可以在提示符下手动解决
我怀疑这是风格和/或个人品味的问题,但我还是想问问。 我一直习惯这样定义包: (defpackage :wibble (:use :cl :drakma) (:export :main)) 一
我是一名优秀的程序员,十分优秀!