我一直在尝试掌握 common-lisp 中的包系统,并且我(有点)理解这个想法。然而,像许多人一样(我搜索了许多其他类似的问题),似乎存在一些我无法完全克服的实施障碍。
所以:我试图定义一个由两个 lisp 文件组成的包。我正在使用 portacle,所有文件都位于同一目录中,包括系统定义和我编写的代码(/portacle/projects/):
ASDF 文件如下所示,它的名称只是 census-api.asd;在同一目录中有一个名为packages.lisp的包文件。
但是,当我尝试 (ql:quickload "census-api") 时,我得到“系统未找到”。
公平地说,如果我检查 Quicklisp 本地目录变量,它似乎应该可以工作:
ql:*local-project-directories*
(#P"c:/Users/Brian/portacle/projects/"
#P"c:/Users/Brian/portacle/all/quicklisp/local-projects/")
同样,我将当前路径更改为项目目录--
(setf *default-pathname-defaults* #P"c:/Users/Brian/portacle/projects/")
#P"c:/Users/Brian/portacle/projects/"
但当我尝试通过 Quicklisp 加载时,这些都不会改变“未找到系统”。我觉得我错过了某种预加载定义步骤?
接下来是什么?
我可以返回到只加载各个文件本身(它们当前使用一个“''(包内#:census-api)''”,它会出错,但我可以评论该行并直接加载),但我' d 希望能够定义系统。
编辑:好的,我直接编译了“packages.lisp”(定义如下);现在,quickload 能够执行“(ql:quickload "census-api")”,并且当通过 common lisp 用户包调用时,相关函数可用,例如 (census-api:set-fips 等)。但我仍然无法使用(包内“census-api”),如果我必须预加载所有这些文件,我觉得我一定做错了什么。
编辑2:好的,(包内:census-api)现在可以工作了,因为:census-api和“census-api”意味着不同的东西,我知道即使我并不总是理解一个与另一个的工作原理)。这解决了我当前的使用问题,但不是更广泛的问题——如何使用快速加载(或任何其他系统实用程序)来避免手动加载包?或者这只是做生意的代价?
人口普查-api.asd
(defsystem "census-api"
:description "A collection of utilities to pull Census, BLS, and Google DistanceMatrix API data.
For default use, evaluate the following --
Census: (set-fips), (set-hh-input), (print-hh-output (output-list))
BLS: (set-fips), (print-bls-data (prepare-hashed-bls-data))
Distancematric: (set-location-params), (print-dm-output (get-data (*api-response*)))"
:author "Brian LastName <[email protected]>"
:license "To be determined"
:version "0.5"
:depends-on ("dexador" "shasht")
:serial t
:components ((:file "census-api")
(:file "distancematrix-api")))
包.lisp:
;;; Packages for Census Work
(defpackage #:distancematrix-api
(:use #:cl)
(:export #:set-location-params
#:call-dm-api
#:parse-response
#:get-data
#:print-dm-output))
(defpackage #:census-api
(:use #:cl)
(:export #:set-fips
#:set-hh-output
#:print-hh-output
#:output-list
#:prepare-hashed-bls-data
#:print-bls-data))
你快到了!
我建议不要
defsystem
单独写,而是:乃至:
这样你就可以加载 .asd 系统定义,并且你的 Lisp 将理解简单和复杂的 ASDF 系统定义。
当未找到系统时,您可以编译并加载 .asd 文件。两种解决方案:
C-c C-k
在 .asd 中使用(slime-load myfile.asd
但更好的是,遵循 ASDF 最佳实践,(asdf:load-asd /path/to/myfile.asd)
.然后
(ql:quickload …)
。漏洞
您没有
packages.lisp
在 .asd 中引用。