2017-10-06 15 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のバッファにいくつかのプリントを参照してください:

は、このコードを考えてみましょう

負荷1 ASDFシステム: cl-who; "cl-who"をロードする

"parenscript"をロードするには:1 ASDFシステムをロードする: parenscript; "parenscript"をロードする。

"hunchentoot"をロードするには:1 ASDFシステムをロードする: hunchentoot; "hunchentoot"の読み込み..............

つまり、2つのバッファの間に何らかの "会話"が起こっているようです。しかし、(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

あなたはネット上の回答を検索しましたか?このテーマにはたくさんの偉大な資料があります(例えば、 "Practical Common Lisp - 21. The Large:Programming in the Large:Packages and Symbols" Peter Seibel http://www.gigamonkeys.com/book/programming-in-the-large -packages-and-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は、括弧の間に接頭辞付き表記を使用しています。したがって、foo("bar")のような関数を呼び出す場合は、(foo "bar")となります。 あなたがしたい場合は、のような関数を作成することができます:あなたはQuicklisp、私はあなたがquicklispをインストールした場所に設置されたパッケージを使用している場合

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

。ホームフォルダにインストールされている場合は、パッケージは/home/user/quicklisp/dists/quicklisp/software/になります。