Error setting load-noisily? and auto-exiting in MI

2019-05-23 02:18发布

问题:

In order to debug MIT-Scheme scripts with Vim, I want to be able to run the script file currently being edited as conveniently as possible. Here is what I'm doing:

sicp.scm

(set! load-noisily? #t)

(define
    (abs x)
    (cond
        ((> x 0) x)
        ((= x 0) 0)
        ((< x 0) (- x))
    )
)

(abs 42)
(abs -24)

(exit)

After executing :!mit-scheme --eval "(load \"sicp\")" when editing sicp.scm in Vim, I get:

Image saved on Saturday May 17, 2014 at 2:39:25 AM
  Release 9.2 || Microcode 15.3 || Runtime 15.7 || SF 4.41 || LIAR/x86-64 4.118
  Edwin 3.116
;Loading "sicp.scm"...

Kill Scheme (y or n)? 

There are two main issues:

  1. The results of both (abs 42) and (abs -24) are not printed, despite the fact that I've already set load-noisily? to #t.
  2. I don't want to enter y manually to kill scheme each time the script is run. It should exit automatically, since there is an (exit) line in the end.

Here is the expected output:

Image saved on Saturday May 17, 2014 at 2:39:25 AM
  Release 9.2 || Microcode 15.3 || Runtime 15.7 || SF 4.41 || LIAR/x86-64 4.118
  Edwin 3.116
;Loading "sicp.scm"... done
;Value: 42
;Value: 24

Moriturus te saluto.

How can I do this?

回答1:

I'm not sure that this one qualifies as a full answer, but this is how to do it in vim+slimv:

  1. Keep only your (define ...) in sicp.scm, remove everything else from the file.
  2. Open sicp.scm in vim and press ,c to start/connect the swank server. This also opens a REPL window.
  3. Place the cursor somewhere into the (define ...) form and press ,d to define your function in the REPL.
  4. Go to the REPL window and type your test expression (e.g. (abs 42)) in insert mode then press ENTER, this will evaluate the test expression and display the result in the REPL window.
  5. You can also evaluate s-expressions from your source window via ,d. Please note that when evaluating multiple s-expressions in one single step (e.g. evaluating a visual selection via ,r) then only the result of the last s-expression is displayed in the REPL window.
  6. In case an error happens then slimv opens the debugger window, displays the backtrace and the possible restarts.


回答2:

OK - I've never used Vim, and haven't used Scheme since 1992 - so I'm guessing here.

Setting load-noisily? inside the file being loaded is probably too late (because load has already decided not to be noisy before it even opens the file). You probably need to set it before calling load. Try removing it from the file and using :!mit-scheme --eval "(begin (set! load-noisily? #t) (load \"sicp\"))"

As far as (exit) is concerned, I have no idea, but...

I've also never used slimv (or here), but it is apparently the Vim equivalent of Slime, which I have used. Slime turns emacs into a wonderful Lisp IDE, and will hopefully do the same for Scheme and Vim.