如何使用quicklisp加载外部依赖项?

时间:2013-09-15 10:32:03

标签: emacs lisp common-lisp clisp quicklisp

这是我的代码:

(defpackage :com.yves.tests (:use :common-lisp))
(in-package :com.yves.tests)
(require :usocket)

每次我评估require指令时,都会收到此错误:

LOAD: A file with name #1=USOCKET does not exist
   [Condition of type SYSTEM::SIMPLE-FILE-ERROR]

当然我在我的REPL中安装了quickload包:

CL-USER> (ql:quickload "usocket")
To load "usocket":
  Load 1 ASDF system:
    usocket
; Loading "usocket"

("usocket")
CL-USER> 

其实昨天晚上我已经安装了它,我的所有代码都在评估,没有抱怨。今天我重温了Emacs和史莱姆。我得到了这个错误。还有其他配置吗?

以下是我的加载路径中的内容:

CL-USER> (princ custom:*load-paths*)
(/Users/yves/quicklisp/ /opt/local/lib/clisp-2.49/dynmod/ ./ ~/lisp/**/)
(#P"/Users/yves/quicklisp/" #P"/opt/local/lib/clisp-2.49/dynmod/" #P"./"
 "~/lisp/**/")
CL-USER> 

我是否应该手动添加每个新包装的路径?不是quicklisp初始化本身应该执行它吗?

2 个答案:

答案 0 :(得分:3)

Svante已经回答了您的问题的基本解决方案,但将quicklisp与asdf(和.asd文件)结合使用可以更轻松地更轻松地扩展项目及其要求。

.asd文件的设置可能如下所示:

;;foobar.asd
(asdf:defsystem :foobar ;this is the name of your project
   :depends-on (:usocket) ;those are the names of the dependencies
   :components ((:file "the-file-name"))) ;this .asd has to be in the same folder (asdf-keyword :module)

在定义foobar.asd后,您可以将项目移动到.quicklisp/local-project/(符号链接将要执行)文件夹,或者告诉asdf how to find your project

现在您应该可以通过(ql:quickload :foobar)

加载项目了

从现在起,asdf / quicklisp将在加载项目之前负责(下载)加载所有已定义的依赖项。

如果您以后想要扩展项目,从而扩展项目.asd文件,则可以在asdf manualstackoverflow找到有价值的信息。可以访问asdf的项目页面here

答案 1 :(得分:2)

Require不是此处所需的操作。

在简单的情况下,您将整个系统放在一个自给自足的文件中,您可以将ql:quickload表单打包成eval-when

(in-package #:cl-user)

(eval-when (:compile-toplevel :load-toplevel :execute)
  (ql:quickload "usocket"))

(defpackage #:com.yves.tests
  (:use #:cl))

(in-package #:com.yves.tests)

;; your code here

如果您想在没有资格的情况下使用usocket中的符号,请在defpackage表单中使用它:

(defpackage #:com.yves.tests
  (:use #:cl #:usocket))

如果您有一个跨越多个文件的更大系统,则可以使用ASDF。快速完成简单设置的方法是quickproject,也可以从Quicklisp获得。