【问题标题】:Can't access CL-USER symbols in new package defined with make-package?无法访问用 make-package 定义的新包中的 CL-USER 符号?
【发布时间】:2014-03-20 05:31:11
【问题描述】:

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

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    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
    

    【讨论】:

    • 有一个默认值,它只是一个空列表。 :)
    【解决方案2】:

    使用defpackage,而不是make-package

    (defpackage :example
      (:use :cl)
      (:export #:thing))
    
    (in-package :example)
    (defun thing () )
    

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

    使用 CCL、CLISP 和 SBCL 检查您的代码会发现行为差异。嗯。

    【讨论】:

    • @Razenrote:仅供参考,我实际上并不确定正确的行为是什么。我在 reddit/r/lisp 上询问过真正正确的行为应该是什么。 SBCL 和 ABCL 引发错误;其他 CL 系统没有。
    • 是的。我刚读过。 make-package 函数只接受 '(:cl) reddit.com/r/lisp/comments/20vry7/…
    • MAKE-PACKAGEDEFPACKAGE - 在 REPL 中使用什么并不重要。不同之处在于编译的源文件,其中 DEFPACKAGE 具有编译时效果,而 MAKE-PACKAGE 没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多