我一直在尝试掌握 common-lisp 中的包系统,并且我(有点)理解这个想法。然而,像许多人一样(我搜索了许多其他类似的问题),似乎存在一些我无法完全克服的实施障碍。
所以:我试图定义一个由两个 lisp 文件组成的包。我正在使用 portacle,所有文件都位于同一目录中,包括系统定义和我编写的代码(/portacle/projects/):
ASDF 文件如下所示,文件名为 census-api.asd;在同一目录下有一个名为packages.lisp的packages文件。
但是,当我尝试 (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)”'',它会出错,但我可以注释该行并直接加载),但我更希望能够定义系统。
编辑:好的,我直接编译了'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")))
packages.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
,而是:
(asdf:defsystem "my-project" …)
甚至:
(require 'asdf)
(in-package :asdf-user)
(defsystem …)
这样你就可以加载 .asd 系统定义,并且你的 Lisp 将理解简单和复杂的 ASDF 系统定义。当未找到系统时,您可以编译并加载.asd 文件。两种解决方案:
C-c C-k
(slime-
load myfile.asd
,但更好的是,遵循 ASDF 最佳实践,
(asdf:load-asd /path/to/myfile.asd)
。
(ql:quickload …)
。错误
packages.lisp
。