【问题标题】:How to start REPL for slimv with MIT-Scheme如何使用 MIT-Scheme 为 slimv 启动 REPL
【发布时间】:2012-02-27 03:36:16
【问题描述】:

我的操作系统是 Debian Squeeze。这是 vim 版本:

VIM - Vi IMproved 7.2(2008 年 8 月 9 日,2010 年 7 月 12 日 02:29:33 编译)

我阅读了关于 http://kovisoft.bitbucket.org/tutorial.html 的教程并尝试为 MIT-Scheme 启动 REPL。不幸的是,我没有开始。

当我按下 ",c" 时,它会启动一个终端窗口来加载 mit-scheme。 vim 的 REPL 缓冲区中没有显示任何内容。终端显示一些错误:

Listening on port: 4005
;netcat: "4005: inverse host lookup failed: Unknown host"
;To continue, call RESTART with an option number:
; (RESTART 1) => Return to read-eval-print level 1.

2 error> 

我阅读了源代码并修复了一些错误(关于 netcat 的参数和其他内容),这是 diff 文件:

*** /home/gaussfrank/slimv/slime/contrib/swank-mit-scheme.scm   2012-02-02 16:41:58.357463955 +0800
--- swank-mit-scheme.scm    2012-02-06 22:30:42.929212874 +0800
***************
*** 113,126 ****

  (define (netcat port)
    (let* ((sh (os/shell-file-name))
!    (cmd (format #f "exec netcat -v -q 0 -l ~a 2>&1" port))
     (netcat (start-pipe-subprocess sh 
                    (vector sh "-c" cmd)
                    scheme-subprocess-environment)))
      (list netcat port)))

  (define (netcat-accept nc)
!   (let* ((rx "^Connection from .+ port .+ accepted$")
     (line (read-line (subprocess-input-port nc)))
     (match (re-string-match rx line)))
      (cond ((not match) (error "netcat:" line))
--- 113,126 ----

  (define (netcat port)
    (let* ((sh (os/shell-file-name))
!    (cmd (format #f "exec netcat -v -q 0 -l -p ~a 2>&1" port))
     (netcat (start-pipe-subprocess sh 
                    (vector sh "-c" cmd)
                    scheme-subprocess-environment)))
      (list netcat port)))

  (define (netcat-accept nc)
!   (let* ((rx "^listening on.*")
     (line (read-line (subprocess-input-port nc)))
     (match (re-string-match rx line)))
      (cond ((not match) (error "netcat:" line))

我重试了,但出现了一些新问题。

;The object #f, passed as the second argument to integer-add, is not the correct type.
;To continue, call RESTART with an option number:
; (RESTART 4) => Specify an argument to use in its place.
; (RESTART 3) => Return to SLIME top-level.
; (RESTART 2) => Close connection.
; (RESTART 1) => Return to read-eval-print level 1.

这是日志文件 (swank.log)

[---Sent---] 0.21
(:emacs-rex (swank:connection-info) nil t 1)

[---Sent---] 16.11
(:emacs-rex (swank:swank-require 'swank-fuzzy) nil t 2)

这是包裹:

8   0.739991    127.0.0.1   127.0.0.1   TCP 50732 > pxc-pin [PSH, ACK] Seq=1 Ack=1 Win=32792 Len=51 TSV=1451459 TSER=1451459
0000   00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
0010   00 67 91 53 40 00 40 06 ab 3b 7f 00 00 01 7f 00  .g.S@.@..;......
0020   00 01 c6 2c 0f a5 f9 57 b4 93 fc 40 7f 85 80 18  ...,...W...@....
0030   10 03 fe 5b 00 00 01 01 08 0a 00 16 25 c3 00 16  ...[........%...
0040   25 c3 30 30 30 30 32 64 28 3a 65 6d 61 63 73 2d  %.00002d(:emacs-
0050   72 65 78 20 28 73 77 61 6e 6b 3a 63 6f 6e 6e 65  rex (swank:conne
0060   63 74 69 6f 6e 2d 69 6e 66 6f 29 20 6e 69 6c 20  ction-info) nil 
0070   74 20 31 29 0a                                   t 1).

9   0.740009    127.0.0.1   127.0.0.1   TCP pxc-pin > 50732 [ACK] Seq=1 Ack=52 Win=32768 Len=0 TSV=1451459 TSER=1451459
0000   00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
0010   00 34 5a 46 40 00 40 06 e2 7b 7f 00 00 01 7f 00  .4ZF@.@..{......
0020   00 01 0f a5 c6 2c fc 40 7f 85 f9 57 b4 c6 80 10  .....,.@...W....
0030   10 00 fe 28 00 00 01 01 08 0a 00 16 25 c3 00 16  ...(........%...
0040   25 c3                                            %.

【问题讨论】:

  • Slimv也可以连接到正在运行的swank server,所以建议你尝试手动启动scheme swank server。通过这种方式,您可以检查问题是在 swank 方面还是 slimv 方面。如果您能够运行 swank 服务器,那么 slimv 应该在按下 ,c 时连接到它。如我所见,打印了“2 错误”,但您知道错误到底是什么吗?
  • ;netcat: "listening on [any] 4005 ..." 是一个错误。我阅读了源代码,发现了。
  • @Tamas Kovacs:我发现这是 swank-mit-scheme.scm 上的一个错误。这是错误代码: (cond ((not match) (error "netcat:" line)) (else (subprocess-input-port nc))) 它使用了 Debian 中 netcat 的过时输出。评论它,写一个新代码让它变得更好。但是当我按下 ",c" 时,在 (sum 0 (+ (* sum 16) (char->hex-digit (read-char in)))) 行中也发生了错误,这使得 (integer-add第192章
  • 程序 (netcat-accept nc) 和 (read-length in) 都是错误的
  • 尝试将此添加到您的.vimrclet g:swank_log=1。这使得 slimv 创建了一个 slimv 和 swank 服务器之间通信的日志文件。请将日志文件发给我(我是 slimv 的作者)进行分析。您描述的错误(在函数读取长度中)表明解码消息长度存在问题。你知道,swank 消息包含 6 个十六进制数字的消息长度,然后是消息本身。

标签: vim scheme lisp netcat mit-scheme


【解决方案1】:

这是一个已知问题。我的 git 存储库中有 Slimv 的a patched version,它解决了这个问题以及其他一些问题。

请注意,我使用 Slimv 是很久以前的事了,所以我不记得我做了哪些确切的更改。我只在 OS X 上测试过,所以 YMMV。

【讨论】:

  • 我很久以前就离开了 Lisp。我记得我已经解决了这个问题。严格来说,这是一个兼容性问题,因为不同版本的 netcat 有不同的行为。假设netcat是bsd版本。
  • @SunQingyao 我最近更新了我的 vimrc 并删除了很多我不再使用的旧插件。我不认为我还有一份我打过补丁的 slimv 的副本,抱歉。这仍然是最新版本的 slimv 的问题吗? github.com/kovisoft/slimv
  • @SunQingyao 我在我的 Windows 分区上找到了代码的旧副本。将其上传到新的仓库并更新了链接。
  • @Symaxion 我在我的 macbook air 上安装 slimv 时遇到了一些问题,现在它变成了我的错,而不是 slimv。无论如何,感谢您提供更新的链接:)
猜你喜欢
  • 2010-10-28
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多