关于命名包和使用它们的常见 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"
DEFPACKAGE
和 IN-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 中的示例)或允许这种情况 - 但你必须忍受后果。
我尝试使用 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"
DEFPACKAGE
和 IN-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 中的示例)或允许这种情况 - 但你必须忍受后果。