2016-11-07 18 views
2

爲了用Vim調試MIT-Scheme腳本,我希望能夠儘可能方便地運行當前正在編輯的腳本文件。下面是我在做什麼:錯誤設置負載噪音?並自動退出MIT-Scheme

sicp.scm

(set! load-noisily? #t) 

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

(abs 42) 
(abs -24) 

(exit) 

Vim將編輯sicp.scm當執行:!mit-scheme --eval "(load \"sicp\")"後,我得到:

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)? 

有兩個主要問題:

  1. 儘管我已將load-noisily?設置爲#t,但不會打印(abs 42)(abs -24)的結果。
  2. 每次腳本運行時,我都不想手動輸入y來終止方案。它應該自動退出,因爲最後有一條(exit)行。

這裏是預期輸出:

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. 

我怎樣才能做到這一點?

回答

2

我不知道,這其中有資格作爲一個完整的答案,但是這是如何做到這一點在vim + slimv:

  1. 只保留您的(define ...)sicp.scm,刪除一切從文件別的。
  2. 在vim中打開sicp.scm並按,c啓動/連接swank服務器。這也打開了一個REPL窗口。
  3. 將光標置於(define ...)表格的某處,然後按,d在REPL中定義您的功能。
  4. 進入REPL窗口並在插入模式下輸入測試表達式(例如(abs 42)),然後按ENTER鍵,這將評估測試表達式並將結果顯示在REPL窗口中。
  5. 您還可以通過,d從源窗口評估s表達式。請注意,當在一個步驟中評估多個s表達式(例如,通過,r評估視覺選擇)時,只有最後一個s表達式的結果顯示在REPL窗口中。
  6. 如果發生錯誤,slimv會打開調試器窗口,顯示回溯和可能的重新啓動。
+0

我在哪裏可以找到所有用法和鍵綁定的完整列表Slimv菜單項?你的[tutorial](http://kovisoft.bitbucket.org/tutorial.html#startup)建議gvim用戶'設置guioptions + = m',但我沒有使用gvim ... –

+1

檢查鍵盤如果你編譯了幫助文件(':helptags〜/ .vim/doc'),那麼你可以在vim中調用它: ':help slimv-keyboard'。你可以在這裏找到關於swank函數的其他信息(比如使用SLDB調試器):':help slimv-swank'。使用REPL的幫助在這裏:':help slimv-repl'。不要擔心'guioptions',如果你使用字符模式vim,那麼你可以通過按',,'來調出slimv菜單。 –

1

好的 - 我從未使用過Vim,自1992年以來沒有使用過計劃 - 所以我在這裏猜測。

設置load-noisily?裏面被加載的文件可能太晚了(因爲在打開文件之前,加載已經決定不會有噪音)。在致電load之前,您可能需要設置它。嘗試從文件中刪除,並使用:!mit-scheme --eval "(begin (set! load-noisily? #t) (load \"sicp\"))"

至於(exit)而言,我不知道,但是......

我也從來沒有使用過slimv(或here),但它顯然是Vim相當於Slime,我使用。史萊姆將emacs變成了一個美妙的Lisp IDE,並希望爲Scheme和Vim做同樣的事情。

+0

正確的命令應該是':!mit-scheme --eval'(begin(set \!load-noisily?\ #t)(load \「sicp \」))''(escaping'!'和'#')。然而,不幸的是,它不起作用:( –

+0

@孫,這是不幸的。看起來你需要明確顯示錶達式然後你可能會考慮定義一個宏,例如'(dump(abs -42) )'會顯示'(abs -42)=> 42'而不是'42'(你可以擴展它以便'(dump(abs 42)(abs -42)...)'顯示多行輸出 –

+1

但是,我仍然建議檢查一下slimv,這是一個更加方便的方法。在編輯器中使用REPL可以創造一個不同的世界。 –