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

Emacs 如何使用quicklisp加载外部依赖项?,emacs,lisp,common-lisp,clisp,quicklisp,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中安装了带有quic

这是我的密码:

(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初始化不是应该单独执行吗?

Require
不是这里需要的操作

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

(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获得。

Require
不是此处所需的操作

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

(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获得。

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后,您可以将项目移动到(符号链接即可)文件夹中,也可以告诉用户

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

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


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

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后,您可以将项目移动到(符号链接即可)文件夹中,也可以告诉用户

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

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


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

非常令人惊讶,因为您的第一个建议正在发挥作用。昨天我用的是第二个。今天早上启动Emacs后,它正在打印我的问题中显示的错误。我稍微修改了一下,将其从
:use
指令中删除,并将其替换为require。我想我需要更深入地理解lisp的名称空间。。再说一遍。有人能解释一下
:packagename
和simple
:packagename
之间的区别吗?我看到了这两个版本,但不知道它们的区别。@dptd:
Defpackage
在大多数地方使用字符串指示符(请参阅CLHS中的词汇表)。任何符号也是其名称的字符串指示符。在读取时,
symbol
获取或创建(有效地)插入当前包中的符号,
:symbol
获取或创建插入关键字包中的符号,
#:symbol
始终创建新的非预期符号。通过使用最后一种形式,您可以避免所有不必要的实习,因为您只关心姓名。这是一个相当小的优化,所以有些人甚至在这里只使用普通符号,因为它在源文件中看起来更干净。非常令人惊讶,因为你的第一个建议是有效的。昨天我用的是第二个。今天早上启动Emacs后,它正在打印我的问题中显示的错误。我稍微修改了一下,将其从
:use
指令中删除,并将其替换为require。我想我需要更深入地理解lisp的名称空间。。再说一遍。有人能解释一下
:packagename
和simple
:packagename
之间的区别吗?我看到了这两个版本,但不知道它们的区别。@dptd:
Defpackage
在大多数地方使用字符串指示符(请参阅CLHS中的词汇表)。任何符号也是其名称的字符串指示符。在读取时,
symbol
获取或创建(有效地)插入当前包中的符号,
:symbol
获取或创建插入关键字包中的符号,
#:symbol
始终创建新的非预期符号。通过使用最后一种形式,您可以避免所有不必要的实习,因为您只关心姓名。这是一个相当小的优化,所以有些人甚至在这里只使用普通符号,因为这在源文件中看起来更干净。