Quicklisp с использованием sbcl: получение ошибки UNDEFINED-FUNCTION при загрузке различных библиотек

Я пытаюсь использовать quicklisp с SBCL 1.0.55.0.debian на xubuntu. Пока все идет медленно. Примерно в половине случаев я могу загрузить библиотеку, например, с помощью (ql:quickload "cl-ppcre").

Но в другой половине времени вместо этого я получаю эту ошибку (при попытке загрузить hunchentoot-cgi, libxml2 и некоторые другие):

The function :NICKNAMES is undefined.
[Condition of type UNDEFINED-FUNCTION]

Я пробовал все перезагрузки, кроме 2 (принять). Это происходит как в emacs/SLIME, так и в REPL. Я не знаю точно, где находится исходный файл, скажем, для 'sb-kernel', но я не уверен, что даже знал бы, как его исправить, если бы знал. Какие-либо предложения?

(ОБНОВЛЕНИЕ: строка (:use :cl) находилась прямо под строкой (:nicknames :alexandria) в package.lisp; замена их местами решила проблему, но мне любопытно, как это вообще получилось.)

Полная трассировка (для hunchentoot-cgi):

The function :NICKNAMES is undefined.
   [Condition of type UNDEFINED-FUNCTION]

Restarts:
 0: [TRY-RECOMPILING] Recompile package and try loading it again
 1: [RETRY] Retry loading FASL for #<CL-SOURCE-FILE "alexandria" "package">.
 2: [ACCEPT] Continue, treating loading FASL for #<CL-SOURCE-FILE "alexandria" "package"> as having been successful.
 3: [ABORT] Give up on "hunchentoot-cgi"
 4: [RETRY] Retry SLIME REPL evaluation request.
 5: [*ABORT] Return to SLIME's top level.
 --more--

Backtrace:
  0: (SB-KERNEL:%COERCE-CALLABLE-TO-FUN :NICKNAMES)
  1: (SB-FASL::FOP-FUNCALL)
  2: (SB-FASL::LOAD-FASL-GROUP ..)
  3: ((FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK :IN SB-FASL::LOAD-AS-FASL))
  4: ((FLET #:WITHOUT-INTERRUPTS-BODY-88923 :IN SB-THREAD::CALL-WITH-RECURSIVE-LOCK))
  5: (SB-THREAD::CALL-WITH-RECURSIVE-LOCK ..)
  6: (SB-FASL::LOAD-AS-FASL ..)
  7: ((FLET SB-FASL::LOAD-STREAM :IN LOAD) ..)
  8: (LOAD ..)
  9: (SB-IMPL::%MAP-FOR-EFFECT-ARITY-1 ..)
 10: ((SB-PCL::FAST-METHOD ASDF:PERFORM (ASDF:LOAD-OP ASDF:CL-SOURCE-FILE)) ..)
 11: ((SB-PCL::EMF ASDF:PERFORM) #<unavailable argument> #<unavailable argument> #<ASDF:LOAD-OP (:VERBOSE NIL) {10ABFD01}> #<ASDF:CL-SOURCE-FILE "alexandria" "package">)
 12: ((SB-PCL::FAST-METHOD ASDF::PERFORM-WITH-RESTARTS (ASDF:LOAD-OP ASDF:CL-SOURCE-FILE)) ..)
 13: ((SB-PCL::FAST-METHOD ASDF::PERFORM-WITH-RESTARTS :AROUND (T T)) ..)
 14: ((LAMBDA () :IN ASDF::PERFORM-PLAN))
 15: ((FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK :IN SB-C::%WITH-COMPILATION-UNIT))
 16: ((FLET #:WITHOUT-INTERRUPTS-BODY-88923 :IN SB-THREAD::CALL-WITH-RECURSIVE-LOCK))
 17: (SB-THREAD::CALL-WITH-RECURSIVE-LOCK ..)
 18: ((FLET SB-C::WITH-IT :IN SB-C::%WITH-COMPILATION-UNIT))
 19: ((SB-PCL::FAST-METHOD ASDF::PERFORM-PLAN (LIST)) ..)
 20: ((LAMBDA () :IN ASDF:OPERATE))
 21: (ASDF::CALL-WITH-SYSTEM-DEFINITIONS #<CLOSURE (LAMBDA # :IN ASDF:OPERATE) {108EF07D}>)
 22: ((SB-PCL::FAST-METHOD ASDF:OPERATE (T T)) #<unused argument> #<unused argument> ASDF:LOAD-OP "hunchentoot-cgi" :VERBOSE NIL)
 23: ((SB-PCL::EMF ASDF:OPERATE) #<unused argument> #<unused argument> ASDF:LOAD-OP "hunchentoot-cgi" :VERBOSE NIL)
 24: (QUICKLISP-CLIENT::CALL-WITH-MACROEXPAND-PROGRESS #<CLOSURE (LAMBDA # :IN QUICKLISP-CLIENT::APPLY-LOAD-STRATEGY) {108EEE4D}>)
 25: (QUICKLISP-CLIENT::AUTOLOAD-SYSTEM-AND-DEPENDENCIES "hunchentoot-cgi" :PROMPT NIL)
 26: ((SB-PCL::FAST-METHOD QL-IMPL-UTIL::%CALL-WITH-QUIET-COMPILATION (T T)) ..)
 27: ((SB-PCL::FAST-METHOD QL-IMPL-UTIL::%CALL-WITH-QUIET-COMPILATION :AROUND (QL-IMPL:SBCL T)) ..)
 28: ((SB-PCL::FAST-METHOD QUICKLISP-CLIENT:QUICKLOAD (T)) #<unused argument> #<unused argument> #<unavailable argument> :PROMPT NIL :VERBOSE NIL)
 29: (QL-DIST::CALL-WITH-CONSISTENT-DISTS #<CLOSURE (LAMBDA # :IN QUICKLISP-CLIENT:QUICKLOAD) {108CD455}>)
 30: (SB-INT:SIMPLE-EVAL-IN-LEXENV (QUICKLISP-CLIENT:QUICKLOAD "hunchentoot-cgi") #<NULL-LEXENV>)
 31: (EVAL (QUICKLISP-CLIENT:QUICKLOAD "hunchentoot-cgi"))
 32: (SWANK::EVAL-REGION "(ql:quickload \"hunchentoot-cgi\")\n")
 33: ((LAMBDA () :IN SWANK::REPL-EVAL))
 34: (SWANK::TRACK-PACKAGE #<CLOSURE (LAMBDA # :IN SWANK::REPL-EVAL) {108CD12D}>)
 35: (SWANK::CALL-WITH-RETRY-RESTART "Retry SLIME REPL evaluation request." #<CLOSURE (LAMBDA # :IN SWANK::REPL-EVAL) {108CD0BD}>)
 36: (SWANK::CALL-WITH-BUFFER-SYNTAX NIL #<CLOSURE (LAMBDA # :IN SWANK::REPL-EVAL) {108CD0A5}>)
 37: (SWANK::REPL-EVAL "(ql:quickload \"hunchentoot-cgi\")\n")
 38: (SB-INT:SIMPLE-EVAL-IN-LEXENV (SWANK:LISTENER-EVAL "(ql:quickload \"hunchentoot-cgi\")\n") #<NULL-LEXENV>)
 39: (EVAL (SWANK:LISTENER-EVAL "(ql:quickload \"hunchentoot-cgi\")\n"))
 40: (SWANK:EVAL-FOR-EMACS (SWANK:LISTENER-EVAL "(ql:quickload \"hunchentoot-cgi\")\n") "COMMON-LISP-USER" 144)
 41: (SWANK::PROCESS-REQUESTS NIL)
 42: ((LAMBDA () :IN SWANK::HANDLE-REQUESTS))
 43: ((LAMBDA () :IN SWANK::HANDLE-REQUESTS))
 44: (SWANK-BACKEND::CALL-WITH-BREAK-HOOK #<FUNCTION SWANK:SWANK-DEBUGGER-HOOK> #<CLOSURE (LAMBDA # :IN SWANK::HANDLE-REQUESTS) {D2420C5}>)
 45: ((FLET SWANK-BACKEND:CALL-WITH-DEBUGGER-HOOK :IN "/home/amperry/.emacs.d/slime-2.7/swank-sbcl.lisp") #<FUNCTION SWANK:SWANK-DEBUGGER-HOOK> #<CLOSURE (LAMBDA # :IN SWANK::HANDLE-REQUESTS) {D2420C5}>)
 46: (SWANK::CALL-WITH-BINDINGS ..)
 47: (SWANK::HANDLE-REQUESTS #<SWANK::MULTITHREADED-CONNECTION {CBAE9B1}> NIL)
 48: ((FLET #:WITHOUT-INTERRUPTS-BODY-223578 :IN SB-THREAD:MAKE-THREAD))
 49: ((FLET SB-THREAD::WITH-MUTEX-THUNK :IN SB-THREAD:MAKE-THREAD))
 50: ((FLET #:WITHOUT-INTERRUPTS-BODY-88894 :IN SB-THREAD::CALL-WITH-MUTEX))
 51: (SB-THREAD::CALL-WITH-MUTEX ..)
 52: (SB-THREAD::INITIAL-THREAD-FUNCTION)
 53: ("foreign function: call_into_lisp")
 54: ("foreign function: funcall0")
 55: ("foreign function: new_thread_trampoline")
 56: ("foreign function: #xB7FA6D4C")

person amp108    schedule 07.06.2014    source источник
comment
Я не решаюсь вмешаться, так как я новичок в Common Lisp, но похоже, что у вас проблема с пакетом Alexandria, который, вероятно, является зависимостью. Он установлен и/или его можно переустановить?   -  person Dan    schedule 07.06.2014
comment
Ошибка исходит из файла package.lisp файла alexandria. Этот файл начинается с (defpackage :alexandria.0.dev (:nicknames :alexandria) ...; я предполагаю, что первая строка либо отсутствует, либо повреждена, из-за чего компилятор интерпретирует вторую строку как вызов функции :nicknames. Проверьте этот файл; он находится по пути ~/quicklisp/dists/quicklisp/software/alexandria-20130128-git/ или что-то в этом роде.   -  person jlahd    schedule 07.06.2014
comment
Такая ошибка возникает, когда (defpackage foo (:nicknames bar)) оценивается, когда активный пакет не использует CL. В этом случае он читается как SOMEPACKAGE::DEFPACKAGE, обрабатывается как функция и пытается оценить аргументы для обычного вызова функции.   -  person Xach    schedule 08.06.2014
comment
Сопровождающие SBCL посчитали хорошей идеей ввести несовместимость с общепринятой практикой (хотя и не со стандартом): пакеты по умолчанию не наследуются от пакета CL.   -  person Rainer Joswig    schedule 08.06.2014


Ответы (1)


Как указал Xach, активный пакет не (:use :cl) к моменту вызова (:nicknames :alexandria). Изменение порядка этих двух строк решило проблему, хотя я понятия не имею, почему они были в такой последовательности с самого начала.

person amp108    schedule 09.06.2014