Юпитер и Лисп
Я пытаюсь установить cl-jupyter (ядро с общим lisp для Jupyter), и я не могу заставить его работать: когда я открываю новый ноутбук lisp (или меняю ядро существующего ноутбука), он вылетает после отображения следующие сообщения:
[I 18:26:50.855 NotebookApp] Kernel started: ccba815a-9065-4fad-9d95-06f6291136d2
To load "cl-jupyter":
Load 1 ASDF system:
cl-jupyter
; Loading "cl-jupyter"
...............
cl-jupyter: an enhanced interactive Common Lisp REPL
(Version 0.7 - Jupyter protocol v.5.0)
--> (C) 2014-2015 Frederic Peschanski (cf. LICENSE)
kernel configuration = ((hb_port . 58864) (shell_port . 37462)
(transport . tcp) (iopub_port . 43232)
(signature_scheme . hmac-sha256) (control_port . 52184)
(stdin_port . 45879)
(key . 2ae7d65f-65f9-40d8-bfd4-21760eaec0ca)
(ip . 127.0.0.1))
[Hearbeat] starting...
[Heartbeat] thread started
[Heartbeat] thread started
[Kernel] Entering mainloop ...
[Shell] loop started
Argh! corrupted error depth, halting
fatal error encountered in SBCL pid 24605(tid 140737353922304):
%PRIMITIVE HALT called; the party is over.
Некоторые детали:
Jupyter
отлично работает с питоном (как 2x, так и 3x).sbcl
также, кажется, работает нормально (я только начинаю с common-lisp, поэтому я могу что-то упустить - но я могу запустить код и использовать asdf и quicklisp).- Я установил его, запустив
python3 ./install-cl-jupyter.py
". - мой
.sbclrc
Файл теперь содержит только(load "~/quicklisp/setup.lisp")
".
Системная информация:
- ОС: Linux 4.1.13-1-MANJARO x86_64 GNU / Linux
- Python 3.5.0
- SBCL 1.3.0
- Jupyter версия 4.0.6
Некоторые вещи, которые я пробовал:
Файл ~/.ipython/kernels/lisp/kernel.json
содержит:
{"argv": ["sbcl", "--non-interactive", "--load", "/home/myusername/lisp/systems/cl-jupyter/cl-jupyter.lisp", "/homemyusername/lisp/systems/cl-jupyter/src", "/home/myusername/lisp/systems/cl-jupyter", "{connection_file}"], "display_name": "SBCL Lisp", "language": "lisp"}
Все пути верны. Когда я запускаю тот же код вручную:
sbcl --non-interactive --load "/home/myusername/lisp/systems/cl-jupyter/cl-jupyter.lisp" "/homemyusername/lisp/systems/cl-jupyter/src" "/home/myusername/lisp/systems/cl-jupyter" kernel-07e04903-c562-4c67-bcc1-b68f4047d8d2.json
(где "kernel-07e04903-c562-4c67-bcc1-b68f4047d8d2.json" - это автоматически сгенерированный файл для lisp-ядра, который я сохранил), он "выглядит нормально" (например, работает и ждет без ошибок).
Я попытался сделать быструю печать отладки, и я думаю, что она src/shell.lisp
, в соответствии
(vbinds (identities sig msg buffers) (message-recv (shell-socket shell))
Но опять же, я могу ошибаться. Так как это похоже на то, что это как-то связано с общением, я позаботился о том, чтобы обновился zeromq
Я не уверен, что дальше, кроме того, чтобы изучить еще немного lisp, а затем вернуться, чтобы правильно отладить код - но я надеялся изучить его, используя Jupyter:)
Буду признателен за любые предложения, спасибо.
1 ответ
Эта проблема вызвана изменением размера структуры сообщения, zmq_msg_t
, в 0MQ версии 4.1.x до 64 байтов с размером 32 байта в версии 4.0.x.
Библиотека интерфейса 0MQ, используемая cl-jupyter
является pzmq
и эта библиотека поддерживает 0MQ до версии 4.0. На момент написания этой статьи pzmq
использует размер сообщения 0MQ 32 байта. Это приводит к внутренним ошибкам, если установлена версия 0MQ 4.1.x.
Здесь есть два решения:
- Понизьте версию 0MQ до версии 4.0.x
- Исправить
pzmq
библиотека путем обновления определенияmsg%
вc-api.lisp
от 32 до 64 байт.
Обновление - 9 мая 2016
pzmq
Библиотека была обновлена для поддержки 0MQ версии 4.1.x (с сохранением совместимости со старыми версиями). Новая версия pzmq
планируется к выпуску в рамках выпуска Quicklisp в мае 2016 года.
Обновление - 1 июня 2016 г.
Релиз Quicklisp за май 2016 года включает обновления pzmq
библиотека, которая решает эту проблему. Понижение уровня 0MQ или модификации pzmq
библиотека больше не нужна.