anquegi
anquegi

Reputation: 11522

Common lisp about naming packages and using them

I try to use Common Lisp packages, but I have several (probably naming conventions) problems, first is the use of "#:" it seems not necessary but is like sharp-quote in functions that is better to use depending on your context.

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

Then is in how to use that package

(in-package #:match-test)

(in-package :match-test)

(in-package match-test)

it works, but when I want to delete that package it only works with:

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

it gives that error, but it makes the job done. It seems working with the package as an object, I also do not understand the hyperspec, is a problem that I need to learn CLOS, that is true I'm a beginner learning Lisp, but I suppose that I can get a easy clarifying for my doubts.

I hope that I said it quite clearly.

Finally I want to say that I used emacs + sly + roswell and

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

Upvotes: 1

Views: 308

Answers (1)

Rainer Joswig
Rainer Joswig

Reputation: 139261

DEFPACKAGE and IN-PACKAGE are defined as macros. They take a literal name - a string designator: foobar, |FOOBAR|, #:FOOBAR, :FOOBAR or "FOOBAR".

DELETE-PACKAGE is a function and expects a string designator, too. But since it is a function, the argument is evaluated. This means: if you want to pass the name, you have to quote it - if it is a symbol not in the keyword package. Strings and keyword symbols are self-evaluating and don't need to be quoted. Valid arguments to DELETE-PACKAGE are for example:

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

Since DELETE-PACKAGE is a function, the argument gets evaluated -> you can also evaluate variables, function calls, ... as argument.

The Error: Deleting the current 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">.

Your code tries to delete the current package - you just used IN-PACKAGE to make it the current package - deleting the current package is usually not a good idea. You are shooting yourself in the foot. A Lisp might prevent that (like my example in LispWorks) or allow it - but then you have to live with the consequence.

Upvotes: 4

Related Questions