2017-10-06 106 views
-2

我目前正試圖理解Common Lisp如何管理它的包和模塊。Common Lisp包和模塊管理

考慮以下代碼:

(in-package :cl-user) 

(ql:quickload :cl-who) 
(ql:quickload :hunchentoot) 
(ql:quickload :parenscript) 

(defpackage :retro-games 
    (:use :cl :cl-who :hunchentoot :parenscript)) 

(in-package :retro-games) 

(defclass game() 
      ((name :initarg :name) 
      (votes :initform 0))) 

當我創建一個泥緩衝區,然後運行它被設置爲煤泥模式的另一個緩衝這段代碼中,我看到一些版畫是*slime-repl sbcl*第一個緩衝區:

加載1 ASDF系統: cl-who;加載「cl-who」

加載「parenscript」:加載1 ASDF系統: parenscript;加載「parenscript」..

加載「hunchentoot」:加載1 ASDF系統: hunchentoot;正在加載「hunchentoot」..............

也就是說,兩個緩衝區之間似乎有一些「交談」。但是,如果我嘗試運行(make-instance game("Chess")),則會出現錯誤,因爲CL-USER程序包不知道game類。

另一方面,如果我在slime repl sbcl緩衝區中運行(in-package :retro-games),我可以運行(make-instance game("Chess"))

問題是Common Lisp如何用軟件包組織它的工作?在相關說明中,緩衝區是slime repl sbcl和緩衝區在slime-mode之間有什麼區別?

這些軟件包是否與Python的虛擬環境類似?也就是說,CL-WHOHUNCHENTOOTPARENSCRIPT在我的情況下安裝在哪裏?我有什麼選擇嗎?

+0

您是否在網上搜索了答案?關於這個主題有很多很棒的材料(例如Peter Seibel的「Practical Common Lisp - 21. Large Programming:Packages and Symbols」http://www.gigamonkeys.com/book/programming-in-the-large -packages和 - symbols.html)。 – rsm

+0

嗨,沒有必要的python和emacs標籤。 – Ehvince

+0

Quicklisp與Python的虛擬環境不同。 Quicklisp將所有庫合併在一起,因此它們協同工作。看[這個討論](https://github.com/quicklisp/quicklisp-client/issues/148)。如果你/需要/喜歡venv,有[Qlot](https://github.com/fukamachi/qlot)。 – Ehvince

回答

3

首先,嘗試(make-instance 'game :name "Chess")。 請注意,Common Lisp在paarenthesis之間使用前綴表示法。所以,如果要調用像foo("bar")這樣的函數,那將是(foo "bar")。如果您正在使用Quicklisp

(defun new-game (game-name) (make-instance 'game :name game-name))

,我要安裝的軟件包在您已經安裝了quicklisp: 如果你願意,你可以創建一個像一個功能。如果它安裝在您的個人文件夾中,則軟件包應爲/home/user/quicklisp/dists/quicklisp/software/