【问题标题】::EXPORT from Package in Common Lisp:EXPORT 从 Common Lisp 中的包中导出
【发布时间】:2019-06-30 09:01:08
【问题描述】:

我已经定义了如下的包:

(defpackage :thehilariouspackageofamirteymuri
  (:nicknames ampack amir teymuri)
  (:use common-lisp)
  (:export say-hi-to))
(in-package :amir)

(defun say-hi ()
  "Docstring"
  "Hello")

(defun say-hi-to (who)
  (concatenate 'string (say-hi) " " who " from " (package-name *package*) "!"))

现在更改为包也可以访问#'say-hi:

(in-package :amir)
(say-hi) ; -> "Hello"
(say-hi-to "World") ; -> "Hello World from THEHILARIOUSPACKAGEOFAMIRTEYMURI!"

export 关键字不是告诉我们要使包外部的东西吗?为什么非外部的#'say-hi 也导出了?

【问题讨论】:

  • 是什么让你觉得say-hi被导出了?
  • 因为更改为创建的包我称之为。
  • 当然,您正在更改为包。但这与出口有什么关系?你怎么看?问问自己“导出”的实际效果是什么......
  • 你能从cl-user包中访问它吗?

标签: package export common-lisp


【解决方案1】:

由于您再次使用(in-package :amir),因此将在该包中评估以下表格,以便您可以使用其中定义的所有功能。要检查导出了哪些定义,您应该切换到不同的包。

让我们试试标准包CL-USER

AMIR> (in-package :cl-user)
#<Package "COMMON-LISP-USER">
CL-USER> (say-hi)
Undefined function SAY-HI called with arguments ("world")  ; as expected, but...
CL-USER> (say-hi-to "world")
Undefined function SAY-HI-TO called with arguments ("world") ; ops!!
CL-USER> (amir:say-hi-to "world)
"Hello world from COMMON-LISP-USER!"
CL-USER> (amir:say-hi)
Reader error: No external symbol named "SAY-HI" in package #<Package "THEHILARIOUSPACKAGEOFAMIRTEYMURI"> .

原因是导出符号并不意味着我们可以在不限定其包的情况下使用它。但是,正如您所见,只有从包中导出的符号才能与“:”一起使用。如果要使用不带包名前缀的符号,必须先导入。

那么,让我们重新开始吧。

CL-USER> (defpackage :another-package (:use :amir))
#<Package "ANOTHER-PACKAGE">
CL-USER> (in-package :another-package)
#<Package "ANOTHER-PACKAGE">
ANOTHER-PACKAGE> (say-hi-to "world")
"Hello world from ANOTHER-PACKAGE!"
ANOTHER-PACKAGE> (say-hi)
Undefined function SAY-HI called with arguments ()

ANOTHER-PACKAGE 中,您现在可以使用导出的符号而无需限定。

一般来说,在 Common Lisp 中导出和导入包中的符号并不是那么直观,并且可以在其他答案中引用的链接中找到对包的所有复杂性的良好描述。

【讨论】:

    【解决方案2】:

    在不更改当前包的情况下检查差异。您将找到更多信息,例如here

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 2011-12-24
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      相关资源
      最近更新 更多