2017-10-06 2 views
-2

Ich versuche gerade zu verstehen, wie Common Lisp seine Pakete und Module verwaltet.Common Lisp Paket- und Modulverwaltung

Betrachten Sie diesen Code:

(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))) 

Wenn ich einen Slime Puffer erstellen und dann diesen Code in einem anderen Puffer ausführen, die Slime-Modus eingestellt ist, sehe ich einige Drucke in dem ersten Puffer, der *slime-repl sbcl* ist:

Load 1 ASDF-System: cl-who; Loading "cl-who"

Um "Parenscript" laden: Load 1 ASDF-System: Parenscript; Laden von "parenscript" ..

So laden Sie "hunchentoot": Laden 1 ASDF-System: hunchentoot; Wird "hunchentoot" geladen ..............

Das heißt, es scheint einige "Gespräche" zwischen den beiden Puffern zu geben. Wenn ich jedoch versuche, (make-instance game("Chess")) auszuführen, erhalte ich einen Fehler, weil das CL-USER Paket über die Klasse game nicht bekannt ist.

Auf der anderen Seite, wenn ich (in-package :retro-games) im slime repl sbcl Puffer laufen lasse, kann ich (make-instance game("Chess")) ausführen.

Die Frage ist, wie organisiert Common Lisp seine Arbeit mit Paketen? In Bezug darauf, was ist der Unterschied zwischen einem Puffer ein slime repl sbcl und ein Puffer in slime-mode ist?

Sind die Pakete überhaupt vergleichbar mit Pythons virtuellen Umgebungen? Das heißt, wo sind die CL-WHO, HUNCHENTOOT und PARENSCRIPT in meinem Fall installiert? Habe ich eine Wahl darüber?

+0

Haben Sie im Internet nach der Antwort gesucht? Es gibt eine Menge großartiges Material zu diesem Thema (zB "Praktische gemeinsame Lisp - 21. Programmierung im Großen: Pakete und Symbole" von Peter Seibel http://www.gigamonkeys.com/book/programming-in-the-large -Pakete-und-Symbole.html). – rsm

+0

hi, die Python- und Emacs-Tags waren nicht nötig. – Ehvince

+0

Quicklisp unterscheidet sich von Pythons virtuellen Umgebungen. Quicklisp erstellt alle Bibliotheken zusammen, so dass sie zusammenarbeiten. Siehe [diese Diskussion] (https://github.com/quicklisp/quicklisp-client/issues/148). Wenn Sie/brauchen ein venv, gibt es [Qlot] (https://github.com/fukamachi/qlot). – Ehvince

Antwort

3

Versuchen Sie zuerst (make-instance 'game :name "Chess"). Beachten Sie, dass Common Lisp eine vorangestellte Notation zwischen der Paaren- these verwendet. Also, wenn Sie eine Funktion wie foo("bar") aufrufen möchten, wäre es . Wenn Sie möchten, können Sie eine Funktion wie erstellen:

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

Wenn Sie Quicklisp verwenden, mich um die Pakete zu installieren, wo Sie Quicklisp installiert haben. Wenn es in Ihrem Benutzerordner installiert ist, sollten die Pakete unter /home/user/quicklisp/dists/quicklisp/software/ sein.