我尝试使用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"
答案 0 :(得分:4)
DEFPACKAGE
和IN-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中的例子)或允许它 - 但是你必须忍受结果。