gpt4 book ai didi

package - :EXPORT from Package in Common Lisp

转载 作者:行者123 更新时间:2023-12-04 00:26:01 27 4
gpt4 key购买 nike

我已经定义了如下的包:

(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 也导出了?

最佳答案

由于您再次使用 (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 中导出和导入包中的符号并不是那么直观,可以在其他答案引用的链接中找到对包的所有复杂性的很好描述。

关于package - :EXPORT from Package in Common Lisp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56823623/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com