Вы можете указать пакеты для наследования символов в defpackage
с помощью :use
, или вы можете вызвать use-package
в том же конце; Я обычно делаю это в defpackage
. Я не знал, что CMUCL вел себя не так, как SBCL, но я всегда включаю (:use :common-lisp)
в свои пакеты. Документация Common Lisp HyperSpe c defpackage
гласит: Если :use
не указано, по умолчанию используется то же значение, зависящее от реализации, что и аргумент :use
для make-package
. Здесь вы можете увидеть разницу между CMUCL и SBCL:
CMUCL
CL-USER> ;; CMUCL
; No value
CL-USER> (defpackage :new)
#<The NEW package, 0/9 internal, 0/2 external>
CL-USER> (package-use-list :new)
(#<The COMMON-LISP package, 0/6 internal, 978/1227 external>)
SBCL
CL-USER> ;; SBCL
; No value
CL-USER> (defpackage :new)
#<PACKAGE "NEW">
CL-USER> (package-use-list :new)
NIL
Функция package-use-list
показывает, что new
пакет использует common-lisp
в CMUCL, но не в SBCL. Вы можете избежать таких проблем, явно use
ing пакетов:
CL-USER> (defpackage :new (:use :common-lisp))
#<PACKAGE "NEW">
CL-USER> (package-use-list :new)
(#<PACKAGE "COMMON-LISP">)
CL-USER> (in-package :new)
#<PACKAGE "NEW">
NEW> (+ 2 2)
4
В файле обычно используется :export
в форме defpackage
для экспорта символов, но из REPL в В пакете new
вы также можете определить функции и экспортировать их символы для использования в других пакетах:
NEW> (defun add3 (x) (+ x 3))
ADD3
NEW> (export 'add3)
T
Затем go вернитесь в основное рабочее пространство, пакет common-lisp-user
и вызовите use-package
для получить доступ к новой функции:
NEW> (in-package :cl-user)
#<PACKAGE "COMMON-LISP-USER">
CL-USER> (use-package :new)
T
CL-USER> (add3 4)
7