2014-05-15 41 views
2

我使用Emacs作爲我的Common Lisp(準確地說是SBCL)編輯器,用SLIME。我按照說明here設置了Quicklisp,並檢查了它是否能在SLIME的以外工作,並且一切都很好 - 我可以抓取並下載代碼,包括它,所有內容。現在SLIME和Quicklisp不能和對方玩好

,我試圖在Emacs使用編譯/加載文件命令的源文件在頂部以下內容:

(ql:quickload "priority-queue") 

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

(in-package :tournament) 

現在,再次在泥不,這個工作精細。但是,在SLIME中,我收到以下錯誤信息:

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

當然,再加一個回溯。我是否錯過了某些東西?我安裝使用package-install從Emacs的泥,和我在我的.emacs以下代碼文件來進行設置:

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

回答

2

這是因爲編譯和加載的時間分開的發生。

編譯時,不會評估普通函數調用(如ql:quickload)。當編譯器試圖處理defpackage窗體(它是而不是是一個普通的函數調用,但是在編譯時有一個副作用的宏)時,加載「priority-queue」的函數尚未被調用,並且包不可用。

如果您加載文件而不是編譯和加載,則不會看到此內容,因爲加載會在加載時評估每個表單。

有幾個選項可用。最簡單的方法是將您的電話打到,例如eval-when,例如

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

我寧願定義系統爲我的項目,無論多小,所以我會做一個tournament.asd文件看起來像這樣:

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

我把在〜/ quicklisp/local-projects/tournament /(與tournament.lisp一起)並在repl中使用(ql:quickload "tournament")開始並加載它。

我經常使用後者的設置,所以我寫了一個Lisp程序來爲我做這個,叫做quickproject