无法访问使用make-package定义的新包中的CL-USER符号?

时间:2014-03-20 05:31:11

标签: lisp common-lisp

我正在阅读The Complete Idiot’s Guide to Common Lisp Packages,我使用make-package创建了一个名为BOB的新程序包。但是,在(in-package :bob)之后,我无法使用CL-USER包中“我”能够使用的任何符号。例如:

CL-USER> (make-package :bob)
CL-USER> (in-package :bob)
BOB> (+ 1 2) 
;; caught COMMON-LISP:STYLE-WARNING:
;; undefined function +

我也尝试使用CL-USER包,如下所示,但我得到了相同的结果:

CL-USER> (make-package :bob :use '(:cl-user))

如何使用CL-USER中定义的符号?

2 个答案:

答案 0 :(得分:9)

CL-USER通常不会导出任何内容。因此使用它是无用的。包使用其他包,并不意味着它导出任何东西。这些是独立的功能。

由于SBCL引入了与常规做法不兼容(虽然不是标准),您必须指定要一直使用的包 - 没有默认值。在此之前,有一个默认值(CLtL1以这种方式定义)。现在SBCL不使用包,ANSI CL标准允许这样做。

如果您想要一个包含CL-USER等使用列表的包,请改为:

CL-USER 1 > (package-use-list "CL-USER")
(#<The COMMON-LISP package, 2/4 internal, 978/1024 external>
 #<The HARLEQUIN-COMMON-LISP package, 3/4 internal, 271/512 external>
 #<The LISPWORKS package, 67/128 internal, 228/256 external>)

CL-USER 2 > (make-package "FOO" :use (package-use-list "CL-USER"))
#<The FOO package, 0/16 internal, 0/16 external>

CL-USER 3 > (in-package "FOO")
#<The FOO package, 0/16 internal, 0/16 external>

FOO 4 > (+ 3 4)
7

答案 1 :(得分:1)

使用defpackage,而不是make-package

(defpackage :example
  (:use :cl)
  (:export #:thing))

(in-package :example)
(defun thing () )

我没有回答你的问题,因为defpackage是绝大多数代码的标准。

使用CCL,CLISP和SBCL检查代码可以揭示行为的差异。 HM。