使用Quicklisp和Portacle识别本地项目/定义系统

问题描述 投票:0回答:1

我一直在尝试掌握 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))
    
common-lisp quicklisp
1个回答
0
投票
你就快到了!

我建议不要单独写

defsystem

,而是:

(asdf:defsystem "my-project" …)
甚至:

(require 'asdf) (in-package :asdf-user) (defsystem …)
这样你就可以加载 .asd 系统定义,并且你的 Lisp 将理解简单和复杂的 ASDF 系统定义。

当未找到系统时,您可以编译并加载.asd 文件。两种解决方案:

    在缓冲区中,使用 .asd 中的
  • C-c C-k
     (slime-
  • 以编程方式评估
  • load myfile.asd
    ,但更好的是,遵循 ASDF 最佳实践,
    (asdf:load-asd /path/to/myfile.asd)
然后

(ql:quickload …)

错误

您没有在 .asd 中引用

packages.lisp

© www.soinside.com 2019 - 2024. All rights reserved.