Общие сведения об именах пакетов и их использовании - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь использовать пакеты Common Lisp, но у меня есть несколько проблем (возможно, соглашений об именах), во-первых, это использование "#:", это кажется необязательным, но похоже на sharp-quote в функциях , которыеЛучше использовать в зависимости от вашего контекста.

(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 голосов
/ 25 мая 2018

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, чтобы сделать его текущим пакетом - удаление текущего пакета обычно не является хорошей идеей.Вы стреляете себе в ногу.Лисп может предотвратить это (как мой пример в LispWorks) или разрешить это - но тогда вам придется жить со следствием.

...