这是我的代码:
(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初始化本身应该执行它吗?
答案 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 manual或stackoverflow找到有价值的信息。可以访问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获得。