【发布时间】:2020-01-07 06:24:36
【问题描述】:
我正在学习定义一个系统,并制作了一个名为 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") 可以正常工作应该。
为什么会发生这种情况,我做错了什么?任何帮助表示赞赏。
【问题讨论】:
标签: package common-lisp asdf