2014-05-15 1 views
2

J'utilise Emacs comme éditeur de Common Lisp (SBCL, pour être exact), avec SLIME. J'ai mis en place Quicklisp selon les instructions here, et vérifié si cela fonctionnait en dehors de de SLIME, et tout allait bien - je pourrais saisir et télécharger du code, l'inclure, tout.SLIME et Quicklisp ne jouent pas bien les uns avec les autres

Maintenant, je tentais d'utiliser la commande Fichier Compile/Charger dans Emacs un fichier source avec le suivant en haut:

(ql:quickload "priority-queue") 

(defpackage :tournament 
    (:use :cl :priority-queue)) 

(in-package :tournament) 

Maintenant, encore une fois, pas dans BOUE, cela a fonctionné bien. Cependant, dans BOUE, je reçois une erreur de la forme suivante:

The name "PRIORITY-QUEUE" does not designate any package. 
    [Condition of type SB-KERNEL:SIMPLE-PACKAGE-ERROR] 

Plus un backtrace, bien sûr. Est-ce que je manque quelque chose en particulier? J'ai installé la boue à l'aide package-install Emacs, et je le code suivant dans mon fichier .emacs pour le mettre en place:

(setq inferior-lisp-program "/usr/local/bin/sbcl") 
(require 'slime) 
(slime-setup) 

Répondre

2

Cela se produit à cause des moments différents de la compilation et le chargement.

Lors de la compilation, les appels de fonction standard (tels que ql:quickload) ne sont pas évalués. Lorsque le compilateur essaie de traiter le formulaire defpackage (qui est pas un appel de fonction ordinaire, mais une macro qui a des effets secondaires lors de la compilation), la fonction qui charge "priority-queue" n'a pas été appelée et le package n'est pas disponible.

Vous ne verrez pas ceci si vous chargez le fichier au lieu de compiler et charger, car la charge évalue chaque formulaire pendant qu'il charge.

Plusieurs options sont disponibles. Le plus simple est d'envelopper votre appel à ql:quickload dans eval-when, par ex.

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (ql:quickload "priority-queue")) 

Je préfère définir un système pour mes projets, mais les petits, donc je ferais un fichier tournament.asd qui ressemble à ceci:

(asdf:defsystem #:tournament 
    :depends-on (#:priority-queue) 
    :serial t 
    :components ((:file "tournament.lisp"))) 

je mettrais que dans ~/quicklisp/local-projects/tournament/(avec tournament.lisp) et utilisez (ql:quickload "tournament") dans le repl pour commencer et le charger.

J'utilise si souvent cette dernière configuration que j'ai écrit un programme Lisp pour le faire quickproject.

Questions connexes