【问题标题】:SLIME and Quicklisp not playing nice with each otherSLIME 和 Quicklisp 不能互相配合
【发布时间】:2014-05-15 10:48:17
【问题描述】:

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

现在,我尝试在 Emacs 中使用 Compile/Load File 命令获取顶部有以下内容的源文件:

(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)

【问题讨论】:

    标签: emacs sbcl slime quicklisp


    【解决方案1】:

    这是因为编译和加载的时间不同。

    编译时,不计算普通函数调用(如ql:quickload)。当编译器尝试处理defpackage 表单(不是一个普通的函数调用,而是一个在编译时有副作用的宏)时,加载“优先队列”的函数尚未调用且包不可用。

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

    有几个选项可用。最简单的方法是将您对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 程序来为我做这件事。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      相关资源
      最近更新 更多