【问题标题】:Common lisp about naming packages and using them关于命名包和使用它们的通用 lisp
【发布时间】:2018-05-25 19:43:42
【问题描述】:

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

【问题讨论】:

  • 如果您在将它们作为形式求值的地方(例如 DELETE-PACKAGE 的参数)使用非内部符号(如 #:FOO)作为名称,则必须像引用任何其他符号一样引用它们(例如(delete-package '#:match-test))。
  • 别心疼,CLHS不是很平易近人。试试gigamonkeys.com/book

标签: common-lisp packages


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2017-04-17
    • 2011-08-24
    • 2012-12-23
    • 2013-06-16
    相关资源
    最近更新 更多