В MacOS: когда я пытаюсь загрузить log4cl, я получаю ошибку компиляции:
CL-USER> (ql:quickload "log4cl")
To load "log4cl":
Load 1 ASDF system:
log4cl
; Loading "log4cl"
.
;
; caught ERROR:
; READ error during COMPILE-FILE:
;
; Lock on package SB-C violated when interning LAMBDA-PARENT while in package
; LOG4CL-IMPL.
; See also:
; The SBCL Manual, Node "Package Locks"
;
; (in form starting at line: 99, column: 0, position: 3779)
COMPILE-FILE-ERROR while
compiling #<CL-SOURCE-FILE "log4cl" "src" "naming-sbcl">
[Condition of type UIOP/LISP-BUILD:COMPILE-FILE-ERROR]
В Ubuntu: я не вижу этой ошибки, и log4cl загружается без проблем. Что может быть причиной этого?
В MacOS у меня есть версия 2.3.3 sbcl. В Ubuntu у меня версия 2.2.3. Похоже, что log4cl не компилируется в новой версии sbcl.
Это взято из этого коммита примерно месячной давности: sourceforge.net/p/sbcl/sbcl/ci/… Возможно, вам следует исправить ошибку для сопровождающих log4cl, а тем временем иметь локальный патч для ее исправления.
Похоже, проблема была исправлена в log4cl: github.com/sharplispers/log4cl/commit/…. Так что я думаю, что мне просто нужно работать в Linux, пока log4cl не будет обновлен в quicklisp.
отлично, это уже исправлено!, я предлагаю вам написать самостоятельный ответ, который обобщает проблему/решение, и принять его
Как сказал coredump:
«Log4cl пытается получить доступ к символу реализации с именем sb-c::lambda-parent, но этот символ, вероятно, не существует на вашем версия sbcl для MacOS, поэтому Lisp пытается добавить символ пакета SB-C; но так как пакет заблокирован, это запрещенный."
А теперь добавлю свои маленькие две копейки:
LAMBDA-PARENT был удален из SBCL 3 года назад со следующим сообщением:
"Remove LAMBDA-PARENT.
LAMBDA-LEXENV already has it."
Теперь вопрос: какова версия вашей библиотеки log4cl и откуда она взялась?
Мой взят из Quicklisp и отлично работает с версией 2.3.2 SBCL, это http://beta.quicklisp.org/archive/log4cl/2021-12-09/log4cl-20211209-git.tgz
Возможно, вам стоит обновить Quicklisp :
Чтобы получить обновленное программное обеспечение, используйте:
(ql:update-dist "quicklisp")
Обновления программного обеспечения обычно доступны примерно раз в месяц.
Чтобы обновить клиент Quicklisp, используйте:
(ql:update-client)
У меня также есть версия log4cl 20211209, которая не работает с sbcl 2.3.3. Так что похоже проблема возникает при обновлении с 2.3.2 до 2.3.3
Да, я могу подтвердить, что он также не работает с SBCL 2.3.3 для меня. Точно такая же ошибка.
Здесь есть несколько решений, что подтверждается комментариями:
sbcl-get-block-name
в .../quicklisp/dists/quicklisp/software/log4cl-20211209-git/src/naming-sbcl.lisp
функцией из этого коммита: https://github.com/sharplispers/log4cl/commit/01242ffbc43f5cf17f612878666341b0a3430c46?diff=split(ql:quickload '(:log4cl))
У меня установлен SBCL 2.3.3 в GNU/Linux, и у меня была та же проблема.
Я решил проблему, используя версию log4cl
из git:
$ cd quicklisp/local-projects/
$ git clone https://github.com/sharplispers/log4cl
Затем работает
(ql:quickload "log4cl")
использует локальную версию, которая включает патч, исправляющий совместимость с SBCL 2.3.3.
Log4cl пытается получить доступ к символу реализации с именем
sb-c::lambda-parent
, но этот символ, вероятно, не существует в вашей версии sbcl для MacOS, и поэтому Lisp пытается добавить этот символ в пакет SB-C; но так как пакет заблокирован, это запрещено. Либоlambda-parent
существовал раньше и был удален (если ваша версия sbcl слишком свежая), либо log4cl является последним и пытается получить доступ к символу, которого нет в слишком старой версии SBCL.