2012-11-18 58 views
3

在通過Peter Seibel的書Practical Common Lisp工作時,我很難理解如何結合Emacs的SLIME和quicklisp來處理Common Lisp包系統。他提供該項目具有以下結構:如何避免爲一個通用的lisp項目加載多個asdf文件?

  • spam.lisp在包com.gigamonkeys.spam,這依賴於其他兩個包,cl-ppcrecom.gigamonkeys.pathnames
  • 在包com.gigamonkeys.pathnames
  • spam.asd,它描述com.gigamonkeys.spam
  • pathnames.asd,它描述了com.gigamonkeys.pathnames

,我已經找不到當前建立的唯一途徑的依賴關係的依賴pathnames.lisp最終目標spam.lisp是:

  1. 編譯並加載pathnames.asd文件使用泥(C-x C-k
  2. 裝入com.gigamonkeys.pathname包通過在REPL
  3. 裝入cl-ppcre包鍵入(asdf:operate 'asdf:load-op 'spam)通過在REPL
  4. 編譯打字(ql:quickload "cl-ppcre")和使用泥
  5. 裝入com.gigamonkeys.spam加載spam.asd文件在REPL輸入(asdf:operate 'asdf:load-op 'spam)

這似乎是一個瘋狂的工作量需要使用的樂趣在單個文件中定義的ctions(spam.lisp) - 我必須做錯了什麼。有沒有辦法用更少的命令加載spam.lisp,並遞歸地加載它的依賴關係?

回答

9

http://weitz.de/bart.gif

Source + Full Story

長話短說,包是符號的包裝袋和系統描述文件和其他系統之間的關係 。

所以,在這裏使用的結構是一個簡單的系統定義:

(asdf:defsystem #:spam-filter 
    :serial t 
    :description "Simple Spam Filter" 
    :author "PCL" 
    :depends-on (#:cl-ppcre 
       #:com.gigamonkeys.pathnames) 

    :components ((:file "package") 
       (:file "spam"))) 

現在,我會假設系統com.gigamonkeys.pathnames~/src/lisp/com/gigamonkeys/pathnames/~/src/lisp/spam-filter/垃圾郵件過濾器。

  1. 的MxslimeRET
  2. ,CD〜/ SRC /口齒不清/ COM/gigamonkeys /路徑名RET
  3. (push (truename ".") asdf:*central-registry*)
  4. ,CD〜/ SRC /口齒不清/ spam-filter RET
  5. (push (truename ".") asdf:*central-registry*)
  6. (ql:quickload :spam-filter)

因爲Quicklisp依靠ASDF加載系統,你已經添加在ASDF搜索路徑中的系統目錄 。

您也可以通過在~/quicklisp/local-projects/中添加 來將系統置於Quicklisp的搜索路徑中。您可以在那裏存儲您的代碼 或使用符號鏈接。

PS:你可以找到 here 粘液的快捷,讓我寫,加RET 而不是(push (truename ".") asdf:*central-registry*)

正好在另一個粘液快捷方式下快速加載系統。 (,QLsome-system-nameRET

+1

很好地完成答案 –

+0

我在此標記爲正確的延遲道歉,但是這正是我一直在尋找。感謝您的明確解釋! – candrews

3

一點點術語​​:

  • 一個Package是Common Lisp的標準功能。包是一個符號的命名空間。而已。它不是文件,而不是模塊,而不是而不是綁定到任何這樣的事情。它甚至不是函數,變量或類的名稱空間。只是爲了符號。有一個慣例將設置一個包的定義放入它自己的文件中。但那只是一個慣例。

  • a 系統用於定義,加載和編譯組成軟件庫或應用程序的所有文件。 系統的想法很舊(超過30年)。 ASDF(另一個系統定義設施)是該想法的一種流行和自由實現。 1984年肯特皮特曼寫了關於The Description of Large Systems

這樣一個系統設施的一部分是一個註冊表,從中可以找到所有系統。系統定義描述了它所包含的文件以及它所依賴的所有系統。通常,這樣的註冊表是文件系統中的目錄和/或運行中的Lisp中的註冊表(變量,...)。

在加載特定系統時,系統工具會查找註冊表並找到它,加載定義,遞歸加載所有需要的系統,然後加載所有文件。

見ASDF手冊:Configuring ASDF to find your systems

相關問題