我正在阅读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
中定义的符号?
答案 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。