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

时间:2018-05-24 10:39:49

标签: common-lisp packages

我尝试使用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}>

它给出了这个错误,但它完成了工作。它似乎使用包作为对象,我也不理解hyperspec,这是我需要学习CLOS的问题,这是真的我是一个学习Lisp的初学者,但我想我可以得到很容易澄清我的怀疑。

我希望我说得很清楚。

最后我想说我使用了emacs + sly + roswell和

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

1 个答案:

答案 0 :(得分:4)

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

DELETE-PACKAGE是一个函数,也需要一个字符串指示符。但由于它是一个函数,因此会对参数进行求值。这意味着:如果要传递名称,则必须引用它 - 如果它不是关键字包中的符号。字符串和关键字符号是自我评估的,不需要引用。 DELETE-PACKAGE的有效参数例如是:

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

由于DELETE-PACKAGE是一个函数,因此会对参数进行求值 - &gt;你也可以评估变量,函数调用......作为参数。

错误:删除当前包

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中的例子)或允许它 - 但是你必须忍受结果。