提前感谢您的帮助。
由两部分组成的问题:
第 1 部分。
有人可以推荐一些关于 SBCL 包管理的文档吗?我遇到了很多麻烦并遇到了令人惊讶的错误,并且很想知道我正在阅读正确的内容。
第 2 部分。
我希望能够解决我自己的问题,但我知道这个群体更喜欢有可重现的问题,所以我将在下面概述出现的问题:
(cl-project:make-project #P"/home/oliver/quicklisp/local-projects/hsm
建立一个系统。(ql:quickload :frugal-uuid)
(ql:quickload :postmodern)
(defpackage hsm
(:use :cl :frugal-uuid :postmodern))
(in-package :hsm-new)
下面我定义了我的功能。
当我评估
(ql:quickload :hsm)
时,我收到以下错误:
Package FRUGAL-UUID does not exist.
请注意,如果我在 REPL 中计算 3. 中的上述表达式,它不会出现错误。
直接从源文件调用
quickload
不太好:
(ql:quickload :frugal-uuid)
(ql:quickload :postmodern)
这里我假设你的
hsm.lisp
文件正在被编译,并且对ql:quickload
的相应调用在目标文件中发出,这样当它被加载时,代码就会被执行。但是,在编译文件时,编译器会遇到 defpackage
,它会扩展为 (eval-when (:compile-toplevel ...)...)
,强制在编译期间进行评估。此时,:frugal-uuid
尚未加载,因为这将在稍后加载编译后的文件时发生。
您也可以也可以在
ql:quickload
块内调用eval-when
以强制在编译时加载依赖项,但最好的方法是将代码组织到systems中。
使用
cl-project:make-project
,您的项目根目录下应该有一个 hsm.asdf
文件,其中包含如下内容:
(defsystem "hsm"
:version "0.1.0"
:author ""
:license ""
:depends-on ()
:components ((:module "src"
:components
((:file "main"))))
:description ""
:in-order-to ((test-op (test-op "hsm/tests"))))
在这里您可以更改项目的依赖项:
:depends (:frugal-uuid :postmodern)
这样当您快速加载
:hsm
时,它也会加载其依赖项。