1

这是我的代码:

(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 和 Slime。我得到这个错误。是否有额外的配置要做?

这是我的加载路径中的内容:

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 初始化不应该自己执行吗?

4

2 回答 2

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 如何找到您的项目

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

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

如果您以后想要扩展您的项目并因此扩展您的项目 .asd 文件,您可以在asdf 手册stackoverflow中找到有价值的信息。asdf 的项目页面可以在这里访问。

于 2013-09-16T20:31:10.840 回答
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 获得。

于 2013-09-15T10:48:16.627 回答