gpt4 book ai didi

emacs - SLIME 和 Quicklisp 相处得不好

转载 作者:行者123 更新时间:2023-12-02 21:26:47 26 4
gpt4 key购买 nike

我使用 Emacs 作为我的 Common Lisp(准确地说是 SBCL)编辑器,并使用 SLIME。我按照说明设置了 Quicklisp here ,并检查它是否在 SLIME 之外工作,一切都很好 - 我可以抓取并下载代码,包括它,一切。

现在,我尝试使用 Emacs 中的“编译/加载文件”命令来获取顶部包含以下内容的源文件:

(ql:quickload "priority-queue")

(defpackage :tournament
(:use :cl :priority-queue))

(in-package :tournament)

现在,再一次,不是在 SLIME 中,这工作得很好。但是,在 SLIME 中,我收到以下形式的错误:

The name "PRIORITY-QUEUE" does not designate any package.
[Condition of type SB-KERNEL:SIMPLE-PACKAGE-ERROR]

当然还有回溯。我是否遗漏了一些特别的东西?我使用 Emacs 中的 package-install 安装了 slime,并且我的 .emacs 文件中有以下代码来进行设置:

(setq inferior-lisp-program "/usr/local/bin/sbcl")
(require 'slime)
(slime-setup)

最佳答案

发生这种情况是因为编译和加载时间不同。

编译时,不会评估普通函数调用(例如ql:quickload)。当编译器尝试处理 defpackage 形式(这不是一个普通的函数调用,而是一个在编译时有副作用的宏)时,加载的函数“priority-queue”尚未被调用,包不可用。

如果您加载文件而不是编译和加载,您将不会看到此内容,因为加载会在加载时评估每个表单。

有几个可用选项。最简单的方法是将您对 ql:quickload 的调用包装在 eval-when 中,例如

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

我更喜欢为我的项目定义一个系统,无论多么小,所以我会创建一个如下所示的锦标赛.asd 文件:

(asdf:defsystem #:tournament
:depends-on (#:priority-queue)
:serial t
:components ((:file "tournament.lisp")))

我将其放入 ~/quicklisp/local-projects/tournament/(与锦标赛.lisp 一起)并在 repl 中使用 (ql:quickload "tournament") 来开始并加载它。

我经常使用后一种设置,因此我编写了一个名为 quickproject 的 Lisp 程序来为我做这件事。 .

关于emacs - SLIME 和 Quicklisp 相处得不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23676072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com