Ipython Jupyter和Common Lisp

Ipython Jupyter和Common Lisp,ipython,common-lisp,zeromq,sbcl,jupyter,Ipython,Common Lisp,Zeromq,Sbcl,Jupyter,我正在尝试安装(一个通用的lisp内核),但无法正常工作:当我打开一个新的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" .............

我正在尝试安装(一个通用的lisp内核),但无法正常工作:当我打开一个新的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
    可以很好地使用python(2倍和3倍)
  • sbcl
    似乎也可以正常工作(我刚开始使用common lisp,所以可能遗漏了一些东西-但我可以运行代码,并使用asdf和quicklisp)
  • 我通过运行“
    python3./install cl jupyter.py
    ”来安装它
  • 我的
    .sbclrc
    文件现在只包含“
    (加载“~/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:)

如果有任何建议,我将不胜感激,
谢谢。

此问题是由于0MQ版本4.1.x中消息结构的大小从版本4.0.x中的32字节更改为64字节而引起的

cl jupyter使用的0MQ接口库是
pzmq
,该库声明支持版本4.0之前的0MQ。在撰写本文时,
pzmq
使用32字节的0MQ消息大小。如果安装了0MQ 4.1.x版,则会导致内部错误

这里有两种解决方案:

  • 将0MQ安装降级到4.0.x版
  • 通过将
    c-api.lisp
    msg%
    的定义从32字节更新到64字节,修复
    pzmq

  • 更新-2016年5月9日

    pzmq
    库已更新为支持0MQ版本4.1.x(保留与旧版本的兼容性)。新版本的pzmq计划作为2016年5月Quicklisp发行版的一部分发布


    更新-2016年6月1日


    2016年5月的Quicklisp版本包括对解决此问题的
    pzmq
    库的更新。不再需要降级0MQ或修改
    pzmq
    库。

    您是否可以取消注释
    src/message.lisp
    末尾的
    格式
    调用
    消息recv
    ?如果未打印,则可能是zeromq存在问题。您还可以尝试
    跟踪
    某些函数,以缩小错误的确切发生位置。这是sbcl的内部功能。
    *当前错误深度*
    *最大错误深度*
    中的一个未绑定或不是
    realp
    编号。请看:(尽管注意这是来自sbcl的另一个版本)我猜不知何故
    !COLD-INIT
    未被调用:这可能与拥有多个线程有关,从本文档中,我猜它可能发生在多线程情况下,
    *最大错误深度*
    未绑定:因此,准确地说,我认为这是SBCL中与线程相关的错误。我修改了您正在使用的sbcl版本,以便在报告该错误时更加精确,即报告是否确实是未绑定的
    *最大错误深度*
    。为了证实我的猜测,你能试着用这个修改版的sbcl运行吗?代码可以在那里找到:唯一的修改是在
    src/code/cold error.lisp中拆分案例检查损坏的错误深度(如果不信任我,可以通过github测试;)