关于命名包和使用它们的常见 lisp

Common lisp about naming packages and using them

我尝试使用 Common Lisp 包,但我有几个(可能是命名约定)问题,首先是使用“#:”,它似乎没有必要,但像 sharp-quote in functions 这样更好用取决于您的上下文。

(defpackage   #:match-test
  (:use       #:match
              #:fiveam
              #:cl)
  (:export #:run!
           #:test-match)
  (:documentation "Test package for testing match project 1 of CS202"))

然后是如何使用那个包

(in-package #:match-test)

(in-package :match-test)

(in-package match-test)

它有效,但是当我想删除那个包时它只适用于:

CL-USER> (delete-package (in-package #:match-test))
#<BOOLEAN <<error printing object>> {2010004F}>

它给出了那个错误,但它完成了工作。好像是用package as object,我也不懂hyperspec,是我需要学习CLOS的问题,没错我是初学Lisp的,不过我想我可以搞定轻松澄清我的疑惑。

希望我说的很清楚

最后想说的是,我用的是emacs + sly + roswell和

CL-USER> (lisp-implementation-type)
"SBCL"
CL-USER> (lisp-implementation-version)
"1.4.6"

DEFPACKAGEIN-PACKAGE 被定义为宏。它们采用文字名称 - 字符串指示符 foobar|FOOBAR|#:FOOBAR:FOOBAR"FOOBAR"

DELETE-PACKAGE 是一个函数,也需要一个字符串指示符。但由于它是一个函数,所以参数被评估。这意味着:如果你想传递名字,你必须引用它——如果它是一个不在关键字包中的符号。字符串和关键字符号是自求值的,不需要用引号引起来。 DELETE-PACKAGE 的有效参数例如:

'foobar
'|FOOBAR|
'#:FOOBAR
:FOOBAR or ':FOOBAR
"FOOBAR" or '"FOOBAR"

因为 DELETE-PACKAGE 是一个函数,参数被计算 -> 你也可以计算变量,函数调用,...作为参数。

错误:正在删除当前包

LispWorks:

CL-USER 43 > (delete-package (in-package #:match-test))

Error: Cannot delete the current package, #<The MATCH-TEST package, 0/16 internal, 2/16 external>.
  1 (abort) Return to top loop level 0.

SBCL:

* (delete-package (in-package #:match-test))

debugger invoked on a SIMPLE-TYPE-ERROR in thread
#<THREAD "main thread" RUNNING {10005605B3}>:
  *PACKAGE* can't be a deleted package:
    It has been reset to #<PACKAGE "COMMON-LISP-USER">.

您的代码试图删除 当前包 - 您刚刚使用 IN-PACKAGE 使其成为当前包 - 删除当前包通常不是一个好主意。你是搬起石头砸自己的脚。 Lisp 可能会阻止这种情况(就像我在 LispWorks 中的示例)或允许这种情况 - 但你必须忍受后果。