2014-11-23 37 views
6

64位Windows 7
Clozure Common Lisp的1.9版WindowsX8632
的Emacs內工作24.3.1
煤泥的changelog日期2014-06 -17
Common Lisp的:如何獲得(在包......)從Emacs的煤泥

我有.lisp文件,它開始作爲如下的一個示例:

(ql:quickload 'qt) 
(in-package "QT") 

程序的其餘部分顯示了一個對話框。 當我從命令行運行這個,wx86cl -load helloqt.lisp它似乎工作正常。 當我從Emacs Slime(C-x C-k)運行它時,它說沒有包「QT」。 但是,如果我首先單獨評估第一行(C-x C-e),那麼我可以編譯整個事情,它的工作原理是模擬嘗試從Windows中的Slime運行QT線程的正常問題。

我該如何做到這一點,所以我可以編譯/運行emacs中的文件,而無需首先手動評估第一行?

另外,爲什麼(in-package ...)更改Slime會話中的當前包?如果我想要與包內容交互,我必須手動更改它。

+0

已經回答了非常類似的問題。這不會是最後一次。我已經添加了一個標籤'eval-when'。 – 2014-11-23 23:58:58

回答

5

作爲一個整體編譯文件時,首先將它作爲一個整體進行閱讀。那時,它還沒有被評估過,所以包QT尚未定義。

您可以使用eval-when來評估早些時候的事情,或者使用系統定義工具(ASDF現在占主導地位)以正確的順序加載您的系統。

Eval-when

請注意,您通常不應該淤泥周圍庫包,但是可以定義你自己的,新鮮的包扶代碼:

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (ql:quickload '#:qt)) 

(defpackage #:qt-example 
    (:use #:qt)) 

(in-package #:qt-example) 

;; your code here 

(如果你想知道,defpackagedefun,defclass等是專門設計的宏,擴展到這樣一個eval-when內的形式。)

這對於一次性小腳本有時可以使用。對於特別是當他們有一個以上的源文件中的任何值得注意的大小的系統,使用航空自衛隊:

;;;; qt-example.asd 

(in-package #:cl-user) 

(asdf:defsystem #:qt-experiments 
    :description "Some experiments with QT." 
    :serial t 
    :components ((:file "package") 
       (:file "qt-example")) 
    :depends-on (#:qt)) 

;;;; package.lisp 

(defpackage #:qt-example 
    (:use #:qt)) 

;;;; qt-example.lisp 

(in-package #:qt-example) 

航空自衛隊配備了許多開源的Common Lisp實現。您可能需要設置ASDF註冊表。我喜歡有我所有的地方項目的一個或兩個基本的目錄,這樣我就可以把下列~/.config/common-lisp/source-registry.conf

(:source-registry 
    (:tree (:home "devel")) 
    (:tree (:home "src")) 
    :inherit-configuration) 

然後ASDF發現下面這些目錄中定義的所有系統。在SLIME中,您可以使用系統名稱REPL中的,load-system,open-system加載它,打開它中的所有文件,可選擇加載它。

當從文件編譯單個頂層表單(使用C-c C-c)時,SLIME從那裏查找in-package表單以找出它應該採用的包。通常,每個文件的頂部只應有一個in-package表單。

在Lisp源文件中,一個常用的快捷方式是C-c ~,它將REPL切換到文件的目錄和點的有效包。