Lisp 导出内部符号
Lisp exports internal symbols
我正在学习定义一个系统并制作了一个名为test的小测试包。它的结构如下所示:
test/
test.asd
hi.lip
hito.lisp
package.lisp
现在在 package.lisp 文件中我定义了我的包:
(in-package :cl-user)
(defpackage :test
(:use #:cl)
(:import-from #:uiop
#:strcat)
(:export #:sayhito))
在test.asd系统中:
(defsystem test
:name "Testing"
:components ((:file "package")
(:file "hi")
(:file "hito")))
在 hi.lisp 中我有一个辅助函数 sayhi
这并不意味着是外部的:
(in-package :test)
(defun sayhi () "Hi")
并且在hito.lisp系统的外部函数hito
:
(in-package :test)
(defun sayhito (name)
(strcat (sayhi) " " name "!"))
我还有一个目录 /home/amir/lisp-link-farm/,我将所有 ASDF 的符号链接放入其中。然后在我的 lisp 初始化文件 (.sbclrc) 中,我将这条路径推入 asdf:*central-registry*
:
;;; The following lines added by ql:add-to-init-file:
#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
(user-homedir-pathname))))
(when (probe-file quicklisp-init)
(load quicklisp-init)))
;; where i am restoring symlinks to systems
(require 'asdf)
(push #p"/home/amir/lisp-link-farm/" asdf:*central-registry*)
现在,当我通过 (ql:quickload :test)
加载测试系统并将包更改为 (in-package :test)
时,内部辅助函数 hi
也可以作为外部符号访问!我只能这样做:
(sayhi) ;; -> "Hi"
但是如果我不更改包(因此在 REPL 中没有 (in-package :test)
)尝试调用 (test:sayhi)
lisp 抱怨 sayhi
不是包测试中的外部符号, 而 (test:sayhito "Lisp")
可以正常工作。
为什么会这样,我做错了什么?感谢您的帮助。
不,它不能作为外部符号访问。正如您自己写的那样,您将包更改为有问题的包,这意味着它是您的 当前包 ,并且所有符号解析都在 内部工作 .就像在特定包中编写代码一样:您可以引用包中的所有符号,而无需在包前添加。
请注意,即使您将当前包更改为 test
,引用 test:hi
(带有一个冒号)也会发出错误信号。
因此,您没有做错任何事,只是期望 REPL 以某种方式具有除源文件之外的其他包解析规则。
看来你还不错。如果导出函数,则可以使用 package:function
(test:sayhito
)(冒号)访问它。如果你不导出它,你仍然可以用双冒号访问它:package::function
(test::sayhi
).
当您在 包中时,您可以直接键入所有符号,无论是否导出,这就是目标。
我正在学习定义一个系统并制作了一个名为test的小测试包。它的结构如下所示:
test/
test.asd
hi.lip
hito.lisp
package.lisp
现在在 package.lisp 文件中我定义了我的包:
(in-package :cl-user)
(defpackage :test
(:use #:cl)
(:import-from #:uiop
#:strcat)
(:export #:sayhito))
在test.asd系统中:
(defsystem test
:name "Testing"
:components ((:file "package")
(:file "hi")
(:file "hito")))
在 hi.lisp 中我有一个辅助函数 sayhi
这并不意味着是外部的:
(in-package :test)
(defun sayhi () "Hi")
并且在hito.lisp系统的外部函数hito
:
(in-package :test)
(defun sayhito (name)
(strcat (sayhi) " " name "!"))
我还有一个目录 /home/amir/lisp-link-farm/,我将所有 ASDF 的符号链接放入其中。然后在我的 lisp 初始化文件 (.sbclrc) 中,我将这条路径推入 asdf:*central-registry*
:
;;; The following lines added by ql:add-to-init-file:
#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
(user-homedir-pathname))))
(when (probe-file quicklisp-init)
(load quicklisp-init)))
;; where i am restoring symlinks to systems
(require 'asdf)
(push #p"/home/amir/lisp-link-farm/" asdf:*central-registry*)
现在,当我通过 (ql:quickload :test)
加载测试系统并将包更改为 (in-package :test)
时,内部辅助函数 hi
也可以作为外部符号访问!我只能这样做:
(sayhi) ;; -> "Hi"
但是如果我不更改包(因此在 REPL 中没有 (in-package :test)
)尝试调用 (test:sayhi)
lisp 抱怨 sayhi
不是包测试中的外部符号, 而 (test:sayhito "Lisp")
可以正常工作。
为什么会这样,我做错了什么?感谢您的帮助。
不,它不能作为外部符号访问。正如您自己写的那样,您将包更改为有问题的包,这意味着它是您的 当前包 ,并且所有符号解析都在 内部工作 .就像在特定包中编写代码一样:您可以引用包中的所有符号,而无需在包前添加。
请注意,即使您将当前包更改为 test
,引用 test:hi
(带有一个冒号)也会发出错误信号。
因此,您没有做错任何事,只是期望 REPL 以某种方式具有除源文件之外的其他包解析规则。
看来你还不错。如果导出函数,则可以使用 package:function
(test:sayhito
)(冒号)访问它。如果你不导出它,你仍然可以用双冒号访问它:package::function
(test::sayhi
).
当您在 包中时,您可以直接键入所有符号,无论是否导出,这就是目标。