SLIME и Quicklisp не ладят друг с другом

Я использую Emacs в качестве редактора Common Lisp (точнее, SBCL) со SLIME. Я настроил Quicklisp в соответствии с инструкциями здесь и проверил, работает ли он снаружи< /em> из SLIME, и все было в порядке — я мог взять и загрузить код, включить его и все.

Теперь я пытался использовать команду Compile/Load File в Emacs для исходного файла со следующим вверху:

(ql:quickload "priority-queue")

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

(in-package :tournament)

Теперь, еще раз, не в SLIME, это работало нормально. Однако в SLIME я получаю ошибку следующего вида:

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

Плюс обратная связь, конечно. Я что-то конкретное упустил? Я установил слизь с помощью package-install из Emacs, и у меня есть следующий код в файле .emacs для его настройки:

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

person Koz Ross    schedule 15.05.2014    source источник


Ответы (1)


Это происходит из-за разного времени компиляции и загрузки.

При компиляции простые вызовы функций (например, ql:quickload) не оцениваются. Когда компилятор пытается обработать форму defpackage (которая является не простым вызовом функции, а макросом, который имеет побочные эффекты во время компиляции), функция, которая загружает "приоритетную очередь", не звонили, а пакет недоступен.

Вы не увидите этого, если вы загрузите файл вместо компиляции и загрузки, потому что load оценивает каждую форму по мере ее загрузки.

Доступно несколько вариантов. Самый простой способ — обернуть вызов ql:quickload в eval-when, например

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

Я предпочитаю определять систему для своих проектов, какими бы маленькими они ни были, поэтому я бы сделал файл турнира.asd, который выглядит следующим образом:

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

Я бы поместил это в ~/quicklisp/local-projects/tournament/ (вместе с турниром.lisp) и использовал (ql:quickload "tournament") в ответе, чтобы начать и загрузить его.

Я так часто использую последнюю установку, что написал для нее программу на Лиспе под названием quickproject.

person Xach    schedule 15.05.2014