MIT Scheme 的基本使用


MIT Scheme 的基本使用

 

注意:運行MIT-GNU Scheme出現“Requested allocation is too large”

請求分配額度太大。嘗試分配更小的堆內存。 
右鍵單擊應用程序的鏈接並選擇屬性。編輯目標,在其中添加自定義參數 --heap 512 即可 
參考鏈接:stackoverflow

 

快捷方式屬性設置

目標:  "C:\Program Files (x86)\MIT-GNU Scheme\bin\mit-scheme.exe" --library "C:\Program Files (x86)\MIT-GNU Scheme\lib" --heap 512 --edit

起始位置:  "C:\Program Files (x86)\MIT-GNU Scheme"

 

安裝和啟動

啟動

在 Windows 下正確安裝 MIT Scheme 系統后,程序菜單里將有一個 MIT Scheme 目錄,其中包含:

  1. Documentation:以瀏覽器方式打開 HTML 形式的 Scheme 文檔
  2. MIT GNU Scheme:Edwin 環境下啟動 Scheme。Edwin 是一個類似 emacs 的編輯器

如果喜歡用命令行交互方式,可以用下述命令建一個快捷命令,放在你的桌面或者命令菜單里。注意將目錄修改為你的系統安裝目錄:
"C:\Program Files\MIT-GNU Scheme\bin\scheme.exe" --library "C:\Program Files\MIT-GNU Scheme\lib"

Edwin系統的退出

C-x z (表示按 Ctrl-x 后按 z 鍵):從 Edwin 中退到 Scheme 的命令交互狀態。此時 Edwin 掛起,可用 (edit) 喚醒掛起的 Edwin,回到掛起前的狀態。

C-x c :停止 Edwin 並回到 Scheme 的命令交互狀態。

C-x C-z:停止 Edwin 並掛起 Scheme 系統。再次啟動 Scheme 將喚醒掛起的 Scheme 系統,回到掛起前的系統狀態。

C-x C-c:停止 Edwin 和 Scheme 系統。

從交互循環進入 Edwin

在交互方式下執行 (edit) 或 (edwin),將啟動或返回 Edwin

交互式執行中退出

在提示符下鍵入下面表達式並回車:

n ]=> (exit)

系統將要求確認。這樣退出后所有在 Scheme 里已經做的事情都將丟掉了。

基本使用:

命令行交互方式下回車,如果已輸入了一個完整表達式,系統就會對其求值並輸出結果

在 Edwin 里 C-x C-e 求值光標左邊的一個完整表達式,M-z 求值光標當時位於其中的整個定義式(一個定義式也就是一個表達式,其左括號從最左邊開始)

命令行交互方式下的基本使用

 

 

命令行方式下的使用

 

基本使用

在交互式執行方式下,系統(啟動后)將在一個窗口顯示版本信息,最后是提示符:

1 ]=>

鍵入的程序代碼將顯示在提示符之后。

此時系統執行 read-evaluation-print 循環(讀入-求值-打印循環,REPL),可以鍵入符合 Scheme 語法要求的表達式(程序),要求系統對其求值。表達式中可以任意換行。一旦系統讀到一個完整的表達式,就會對它求值(計算),並打印出求得的值。

Scheme 不區分標識符中的大寫和小寫,define 和 DEFINE,Define 同樣對待。

啟動后的提示符 1 ]=> 中的數字 1 表示當前系統運行在第一層“讀入-求值-打印循環”。如果求值中出錯,系統將進入更高層次的“讀入-求值-打印循環”,也是系統的出錯處理循環。在出錯循環中仍然可以像在第一層循環一樣使用 Scheme 系統,還可以做一些其他事情(參看 Scheme 文檔)

退出一層或多層讀入-求值-打印循環

可以用 Ctrl-u 組合鍵退出一層求值循環,用 Ctrl-g 退到第一層循環。

中斷執行:

  • 組合鍵 Ctrl-g:殺掉正在進行的求值並回到第一層 REPL
  • 組合鍵 Ctrl-x:殺掉正在進行的求值並回到當前 REPL
  • 組合鍵 Ctrl-u:殺掉正在進行的求值並回到上一層 REPL
  • 組合鍵 Ctrl-b:暫停當前求值進入斷點 REPL。可以用 (continue) 喚醒中斷的執行

 

 

 

 

Edwin方式下的基本使用

 

 

Edwin 的基本使用

 

概述

Edwin 是 MIT Scheme 系統的一個窗口式的編輯使用前端。其功能和使用方式都像著名編輯器 EMACS,使用方面的進一步細節可以參考EMACS。本頁簡單介紹 Edwin 的使用。

啟動 Edwin 實際上是先啟動 Scheme 系統再啟動一個 Edwin 前端。Edwin 是一個用 Scheme 寫的交互式編輯器。其特點是支持 Scheme 表達式的編輯和求值。

介紹 Edwin 的文檔里常提到 buffer,這個概念類似於一般多窗口編輯器的編輯區。

兩種不同執行模式

在 Edwin 執行時,一個編輯區(稱為一個 buffer)可能處於兩種不同的運行模式:

Edwin 模式

也就是編輯 Scheme 文件的模式。如果裝入一個 .scm 文件,相應的 Edwin 的這個編輯區處於 Edwin 模式。在這種模式下可以編寫 Scheme 程序,也可以對表達式求值。正常求出的值顯示在最下面交互行,但不會顯示出錯信息,也不能進入調試系統

特殊的 REPL 模式

這時可以看到窗口下面狀態條中顯示 (REPL: lesten)。這時系統處於正常的 Scheme 交互模式,所有輸出都顯示在編輯器的窗口里,只不過是在 Edwin 里執行。在這種情況下可以看到所有系統輸出(包括出錯信息),也可以進入 debuger(是一個用 Scheme 寫的交互式程序,它啟動后打開另一個窗口)。
任何時候都可以用 M-x repl 回到或打開一個 REPL buffer。

啟動 Edwin 后編輯器處於支持輸入和求值 REPL 的模式。窗口下方黑條顯示:

--**-Ediwin: *Scheme*    (REPL: Listen) ----All----

表示 Edwin 的模式,這時 Scheme 正在 REPL (Read-Evaluation-Print-Loop,讀入-求值-打印循環) 中等待輸入。上部大區域是交互窗口,可以在這里輸入表達式並要求求值。

建議大家在編輯模式下編寫程序(函數的定義,所需基本數據的定義等),檢查無誤后(例如,函數能正常定義了)保存,然后在 REPL 模式里裝入(用 Scheme 語言的 load,見使用簡介)並做各種試驗和調試(輸入並求值各種具體計算表達式)。

記號:

C-x,C-c 等表示按住 Ctrl 鍵的同時按 x 或 c 鍵;

M-p 等表示在按住 Meta 鍵的同時按 p鍵。在 PC 鍵盤上沒有 Meta 鍵,可以直接用 Alt 鍵加上 p 鍵,或者先按 Esc 鍵再按 p 鍵。

幫助信息

在 Edwin 里按 Ctrl-h t,它會裝入一個 tutorial 文件,其中講述了各種常用命令。在 Windows 的 Scheme 程序菜單里的 Documentation 包含大量與 Scheme 有關的信息。

網上可以找到許多相關信息。下面是一些有用鏈接:
http://www.cnblogs.com/Henrya2/archive/2009/02/21/1395615.html
http://blog.csdn.net/msnlogo/archive/2009/04/05/4050176.aspx
http://www.blogjava.net/zhenyu/archive/2006/10/17/75657.html
http://harry.javaeye.com/blog/446418

退出系統

C-x z (表示按 Ctrl-x 后按 z 鍵):從 Edwin 中退到 Scheme 的命令交互狀態。此時 Edwin 掛起,可用 (edit) 喚醒掛起的Edwin,回到掛起前的狀態。

C-x c :停止 Edwin 並回到 Scheme 的命令交互狀態。

C-x C-z:停止 Edwin 並掛起 Scheme 系統。再次啟動 Scheme 將喚醒掛起的 Scheme 系統,回到掛起前的系統狀態。

C-x C-c:停止 Edwin 和 Scheme 系統。

求值 (exit) 退出 Scheme 系統。

簡單編輯和執行

光標移動可以通過普通移光標鍵,或通過鼠標點擊。用 Delete 或 Backspace 鍵刪除字符。

在正常輸入過程中,每次輸入右括號 "(",環境將自動閃爍對應的左括號 ")"。

對於多行輸入的表達式,換行后按 C-i,系統能將光標自動對齊到合適位置。對於各種復雜的 Scheme 表達式,例如 let, cond, 等等,Edwin 都定義了很好的對齊方式。

求值表達式的方式:將編輯光標(反色小塊)移到表達式后面,按鍵 C-x C-e 。

被求值的表達式將由另一個線程求值,在求值過程中我們仍然可以做編輯工作。

C-c C-x 或 C-c C-u,用於殺掉正在進行的求值。

C-c C-b 中斷當前求值,進入斷點狀態。

翻頁等命令:

C-v:向下翻一屏   M-v:向上翻一屏
C-a:移動到行首   C-e:移動到行尾

兩個常用操作

在 REPL 模式下,所有輸入的歷史都有記錄。這使我們可以很方便地再次使用曾經輸入過的表達式。 M-p 反向枚舉曾經輸入的表達式,M-n 正向枚舉這些表達式。

這里列出了 Edwin 的常用命令(英文)

 

how to use the Edwin
 
1, if there is no META or EDIT key, Alt is that key.
 
2, to end the session, C-x C-c.
 
3, C-v, to the next screen
 
4, C-g will quit what it was doing and allow you to enter it in again from scratch.
 
5, C-k kill from the current cursor position to end of line
 
6, whenever you kill something bigger than a character, Emacs saves it for you. to yank it back, use C-y.
 
7, C-x C-e to evaluate the expression.
 
8, you are now in the tutorial screem.
  Type: C-x b *scheme* to get into an evaluation buffer.
  Type: M(Alt)-p to access the history of *scheme*.
  Type: C-x b tutorial to go back to the tutorial screem.
 
9, undo: C-x u, it undo the last command.
 
10, File: C-x C-f filename  -->  enter into the "finding buffer" to find a file.
                                if the file exits, it find the file, if not
                                exits,create a file named filename.       
         C-x C-f C-g  --> cancel the "finding buffer" without doing anything.
         C-x C-s   -->  Save the file.
 
11, buffer:  C-x C-b:  if you find a new file with C-x C-f in the             
            Edwin,the first file remains in the Edwin,Type C-x C-b
            to find them (it shows a list of all the buffers now in
            the Edwin). Any text you see in the Edwin, has to be
            in some buffer.   if you have edited a file or something
            and go to another file without saving the first one, the
            changes would not save, unless you reback to the first
            file, and C-x C-s. There is a way to save all the changed
            file, that is C-x s. the command goes through the list
            of buffers, and saves every changed buffer.
 
12, C-x 1   remove the document from the screem.
 
13, C-s     find a word or string, type C-s,and then, type in the word,
            once, you would find the
            word, again, you will find the next occurrece of the
            word you have typed in. type in C-g, you will go back to the
            first place where you press "C-s".
14, C-x 1   display only one window.
 
15, C-h ?   tell you what kinds of help you can get.
 
16, C-h c + command: tell you the basic intro to the command.
                     to get more information, use C-h k + command.
                     to get info of a function, use C-h f + function

 

 

 

 

這里列出了 EMACS 的一些常用命令(中文,在 Edwin 里都可用)

 

程序

C-x C-z 掛起程序

C-c C-x 退出程序

C-c k   關閉buffer

C-l     重畫屏幕

C-g     結束命令,或者假死中恢復,也可以按3次ESC

 

文件

C-x C-s 保存

C-x C-w 另存為

C-x C-f 打開文件

C-x C-r 只讀方式打開

C-x C-v 讀入另外一個文件代替當前buffer的文件

C-x s   保存所有

C-x i   將文件的內容插入

M-x revert-buffer    恢復到原始狀態

 

跳轉

前/后     單位

C-f/b    字

M-f/b    詞

C-a/e    行內

M-a/e    句

M-</>    文檔

C-p/n    行間

M-{/}    段落

C-x ]/[  頁

C-x C-x  文件內,mark之間

 

M-g g  跳到指定行

M-x goto-char 跳到指定字符

 

編輯

M-u       后面單詞變為大寫

M-l       后面單詞變為小寫

M-c       后面單詞的首字母變大寫

M-/       補全

C-j       從當前位置分成兩行,相當於RET + tab

M-(       插入()

C-q tab   插入tab

C-q C-m   插入^M

M-;       插入注釋

C-o       回車

 

刪除

M-d   后一詞

C-d   后一字

M-del 前一詞

M-k   到句尾

M-"   前面的所有空白

M-z   刪到指定字母處

C-k   刪除到行尾

 

文本換位

C-t        字符

M-t        單詞

C-x C-t    行

M-x transpose-* 其他命令

 

撤銷

C-/

C-x u

C-_

C-z

 

重做

C-g M-x undo

C-g C-/

C-g C-z

C-g C-_

 

粘貼

C-y

C-v

 

tab/空格轉換

M-x tabify

M-x untabify

 

讓選擇的區塊自動對齊

M-x indent-region

 

其他命令

C-u <數字> <命令> 重復命令n次

M-<數字>   <命令> 同上

M-!     運行shell命令

C-u M-! 執行一條外部命令,並輸出到光標位置

M-x cd  改變工作目錄

M-x pwd 當前工作目錄

 

C-" 啟動輸入法

M-` 菜單

F10 菜單

M-x eval-buffer 在.emacs的buffer中運行,重新加載emacs配置

 

查找替換

----------------------------------------------------------------------

C-r 向上查找

C-s 向下查找

C-s C-w 向下查找,光標位置的單詞作為查找字符串

C-s C-y 向下查找,光標位置到行尾作為查找字符串

C-s RET <查找字符串> RET   非遞增查找

C-s RET C-w              不受換行、空格、標點影響

C-M-s                    正則式向下查找

用向上查找命令就將上面命令的s替換為r

 

M-%   替換

C-M-% 正則式替換

 y 替換當前的字符串並移動到下一個字符串

 n 不替換當前字符串,直接移動到下一個字符串

 ! 進行全局替換,並要求不再顯示

 . 替換當前字符串,然后退出查找替換操作

 q 退出查找替換操作,光標定位到操作開始時的位置

 

其他命令

M-x replace-*

M-x search-*

 

窗口

C-x 0 關掉當前窗口

C-x 1 關掉其他窗口

C-x o 切換窗口

C-x 2 水平兩分窗口

C-x 3 垂直兩分窗口

C-x 5 2 新frame

 

buffer

C-x C-b        查看

C-x b          切換

C-x C-q        設為只讀

C-x k          刪除

C-x left/right 切換

 

翻頁

C-v 下一頁

M-v 上一頁

 

選擇

M-h     選擇段落

C-x h   全部選擇

 

普通區塊

C-SPC   M-x set-mark-command 單個位置set mark

C-@     同上

M-@     對word進行set Mark

M-w     先set Mark,移到光標,M-w就可以復制

C-w     剪切

 

矩形區塊

用這些快捷鍵要先關閉cua-mode

C-x r t      用串填充矩形區域

C-x r o      插入空白的矩形區域

C-x r y      插入之前刪除的矩形區域, 粘貼時,矩形左上角對齊光標

C-x r k      刪除矩形區域

C-x r c      將當前矩形區域清空

 

寄存器

----------------------------------------------------------------------

光標位置和窗口狀態

C-x r SPC <寄存器名>                   存貯光標位置

C-x r w <寄存器名>                     保存當前窗口狀態

C-x r f <寄存器名>                     保存所有窗口狀態

C-x r j <寄存器名>                     光標跳轉

 

文本和數字

C-x r s <寄存器名>                     將連續區塊拷貝到寄存器中

C-x r r <寄存器名>                     將矩形區塊拷貝到寄存器中

C-u <數字> C-x r n <寄存器名>           將數字拷貝到寄存器中

C-x r i <寄存器名>                     在緩沖區中插入寄存器內容

M-x view-register                     查看寄存器內容

M-x list-registers                    查看寄存器列表

 

宏模式

C-x (                    開始一個宏的定義

C-x )                    結束一個宏的定義

C-x e                    執行宏

M-x name-last-kbd-macro  給最后一個宏命名

M-x insert-kbd-macro     在當前文件中插入一個已定義並命名過的宏

 

書簽

C-x r m <name>           設置書簽

C-x r b <name>           跳轉到書簽

C-x r l                  書簽列表

M-x bookmark-delete      刪除書簽

M-x bookmark-load        讀取存儲書簽文件

M-x bookmark-save        保存到文件

 

目錄模式

----------------------------------------------------------------------

C-x d     M-x dired     啟動目錄模式

C-x C-d   簡單目錄

h         幫助

?         簡單幫助

請參考http://www.emacs.cn/Doc/Dired

 

幫助

C-h k    顯示你將按下的鍵執行的function.

C-h f    列出function的功能說明。

C-h b    列出目前所有的快捷鍵。

C-h m   列出目前的mode的特殊說明.

C-c C-h 列出以C-c 開頭的所有快捷鍵.

 

 

調試

如果正在進行的求值出錯,系統將給出一些錯誤信息,並詢問是否啟動調試器(debuger)。回答 y 要求系統啟動調試器,顯示出一個新的調試器窗口;回答 n 回到原求值循環。

(這部分內容將進一步建設)

編輯技術

其他

Edwin 前端是一個功能強大的編輯器,允許用 Scheme 對其功能進行任意的擴充。這方面情況與 EMACS 類似,只是這里用的擴充語言是 MIT Scheme(EMACS 用的是 EMACS Lisp)。請參考 MIT Scheme 文檔和 EMACS 文檔。

 

 

 

 

 

 

MIT-GNU-Scheme 文檔

Scheme 文件操作

編輯和裝入程序文件:

如果程序比較長,可以用系統外的編輯器編寫好程序源文件,而后用 load 函數裝入系統。下面是一個用絕對路徑的實例:

1 ]=> (load "e:\\temp\\test1.scm")

求值這個表達式,可以看到文件裝入的信息。load 函數還可以裝入編譯好的程序文件,詳情見 Scheme 文檔 “MIT Scheme User's Manual” 的 “3.2 Loading Files”。

用函數 cd 可以轉換當前工作目錄。下面是一個實例:

1 ]=> (cd "e:\\temp")

此后就可以直接用文件名裝入這個目錄下的文件了。

保存和恢復系統映像:

可以將 Scheme 系統的當前運行現場保存起來,以便將來回復這個現場。這樣保存的現場稱為一個“world image”或者一個“band”。實際上,Scheme 啟動時也就是裝入了一個默認的 band,裝入編譯器的啟動方式就是裝入另一個 band。

函數 save-disk 將當前現場存入文件。下例將現場存入當前目錄下的文件 image1:

1 ]=> (disk-save "image1")

函數 disk-restore 恢復原保存在一個文件里的現場:

1 ]=> (disk-restore "image1")

閱讀 MIT Scheme 文檔:

“MIT Scheme Reference” 介紹 MIT Scheme 的詳細功能,“MIT Scheme User's Manual” 介紹 MIT Scheme 的使用。“SOS Reference Manual” 介紹的 SOS 是 Scheme 的一個對象系統,“IMAIL User's Manual” 介紹的 IMAIL 是用 Scheme 做的一個郵件閱讀器。下面簡單介紹與前兩個文檔有關的若干問題。

MIT Scheme 手冊的主要內容是介紹這個 Scheme 系統提供的功能,包括預定義的變量(variable)、特殊形式(special form)和過程(procedure,函數)。例如

  • 過程的實例:
    procedure: eqv? obj1 obj2 
    過程名是 eqv?,取兩個參數。使用的例子: (eqv? 3 2)

procedure: list object ... 
過程名是 list,取 0 個或任意多個參數。用例: (list 1 2 3 4)

  • 特殊形式的實例:
    special form: lambda formals expression expression ... 
    特殊形式,名字是 lambda,后面應有一個參數表和一個或多個表達式。
    用例: (lambda (x y) (+ x y))

 

我想有件事情肯定是對的,就是買了Structure and Interpretation of Computer Programs這本書籍。這本書在網上的評價甚高,被稱為巫師書。
書中介紹說是本科低年級的教材。而我本人,02年西安交大畢業,工作近七年,而且毫不謙虛地說,本人對計算機程序的執行的理解有深刻的認識,在國內,和同齡的程序員,更甚者比高齡的程序員,我絲毫不弱,但是,當我讀這本書的時候,我明顯的覺得,國內教育與國外教育的巨大差別,因為,書中很多思想都是我未曾見識過的,想象我已經工作七年了,而這本書只是MIT的本科低年級學生的教材。

當我在網上搜索的時候,我發現,不光是MIT,包括UCB,Standford等著名大學都在講授這門課程,而且我還幸運的發現,UCB有這門課的網絡視屏,正好可以跟着學習。

現在言歸正傳,這教材是MIT press出版的,我就依此為線索,我想知道MIT這樣的名校,他們的計算機系都開些什么課程,參考了一些關於中國人對國外教育的研究論文,而且也發現了下面的鏈接:
http://www.core.org.cn/OcwWeb/Global/all-courses.htm#ElectricalEngineeringandComputerScience

MIT的CS科系稱之為:EECS,也就是電子工程和計算機科學系,有趣的時候,他們設置的第一門課程就是:計算機的程序構造與解釋。所以,我越發覺得這么課程的重要性。課程代號為6.001.

我想借此機會,分析一下MIT的課程設置,當然,特別是與計算機相關的課程。
EECS大概涵蓋如下幾個專業知識:電氣工程,生物工程,自動控制,人工智能,通信系統,電子的各領域等。
與計算機相關的課程有:
6.001: 計算機程序的構造與解釋
6.033: 計算機系統工程,指定的教材竟然是人月神話,當然還有一系列的paper需要閱讀。
6.035:計算機語言工程:是有關計算機系統和體系結構的一門課程,可能主要涉及編譯原理。通過可選教材看出這一點
6.046J: 算法導論
6.090:6.001的實踐課程,獲取編程經驗。
6.823:計算機系統和體系結構:計算機體系結構:定量的方法,計算機組織與設計:硬件與軟件接口。
6.824:分布式計算機系統
6.826:計算機系統原理
6.828:操作系統工程:萊昂氏Unix操作系統注釋
6.829:計算機網絡

還有很多交叉的課程。至少我認為上述的:
001,033,035,046,823,826,828這七門課程是需要好好學習的,至少是要了解個大概的。
先不說別人的課程還有大量的實踐作業,就是在內容上的差距,我們相比起來也是差的太遠了。
難怪他們能培養出來大師級人物。我們的教育,還有很長的路要走。

來源: <http://blog.csdn.net/stephanxu/article/details/3858918>

 

===================== End

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM