大家吼,我是蘑菇老師,今天我們來學(xué)習(xí)怎么用裝好的MIT-Scheme。
認(rèn)識界面
雙擊桌面的快捷方式,我們就看到了這樣的一個窗口,看標(biāo)題欄,這是一個叫做Edwin的程序。

咦,再仔細(xì)看,任務(wù)欄里面有兩個窗口,另一個是這樣的:

這個窗口叫交互窗口。但是現(xiàn)在只有Edwin窗口在激活的狀態(tài),而交互窗口不在工作中。等以后我們再用這個模式,現(xiàn)在還是先把注意力集中于Edwin窗口。
使用Edwin
Edwin是專用于編寫Scheme的編輯器,功能與Emacs非常接近。如我之前的日志提到的,Emacs提供了非常適合編寫Lisp的環(huán)境,Edwin也為編寫Scheme提供了很多便捷的功能。
在Edwin里面,我們可以編輯字符,也就是程序代碼。但是要想進(jìn)行復(fù)制、粘貼等操作,或者是讓代碼運(yùn)行起來,就需要使用快捷鍵了。這里列出幾個基本的快捷鍵,關(guān)于更詳細(xì)的信息,可以參閱
Edwin Cheat Sheet
注:C-x 是Ctrl+x的簡寫,而M-x就是Alt+x的簡寫,以此類推
區(qū)域操作
在Edwin里,不像windows可以選中一段文字來操作,所以需要一個叫做“標(biāo)記”的東西。放置了標(biāo)記之后,把光標(biāo)移動到另一個位置,就可以通過快捷鍵來操作光標(biāo)到標(biāo)記之間的內(nèi)容。為方便起見,這里將以標(biāo)記為起點(diǎn),光標(biāo)為終點(diǎn)的這一部分區(qū)域稱為“標(biāo)記區(qū)域”。
先介紹幾個快捷鍵
C-k 刪除本行里,光標(biāo)后面的部分
C-space 放置標(biāo)記
C-w 刪除標(biāo)記區(qū)域,內(nèi)容進(jìn)入剪貼板
M-w 拷貝標(biāo)記區(qū)域,內(nèi)容進(jìn)入剪貼板
C-y 粘貼剪貼板的內(nèi)容
C-a 跳到一行的開頭
c-e 跳到一行的結(jié)尾
從這里可以看到,刪除特定的區(qū)域可以用C-w完成。復(fù)制,用到了M-w和C-y。而剪貼可以通過C-w和C-y的組合實(shí)現(xiàn)。
跟Scheme有關(guān)的快捷鍵
跟Scheme有關(guān)的命令
C-x C-e 按順序按這兩個組合鍵,執(zhí)行光標(biāo)左邊的一個表達(dá)式
M-z 執(zhí)行當(dāng)前光標(biāo)所在的表達(dá)式
C-M-z 執(zhí)行標(biāo)記區(qū)域內(nèi)的表達(dá)式
C-c C-c 停止執(zhí)行
Tab 自動縮進(jìn)
就先介紹這幾個吧。你可能會問了,為什么所有的功能都要靠按鍵來完成?其實(shí),這些編輯器以前是純文字界面中運(yùn)行的,那時候沒有鼠標(biāo),也沒有窗口和按鈕,想要實(shí)現(xiàn)什么功能,快捷鍵是最方便和最迅速的方式。
對入門者來說(我也是個入門者),最頭疼的就是這么多命令,該怎么記?我的建議就是,不要記。把Cheat Sheet準(zhǔn)備好,編程的時候就放在屏幕的另一邊,要什么功能就看一眼。其實(shí)一來二去的,常用的功能就記下來了。
Scheme表達(dá)式
嗯,差不多了,這就開始吧。從最基本的數(shù)學(xué)運(yùn)算開始,走起:
(+ 1 2) //然后按 M-z 或者C-x C-e
Value: 3 //結(jié)果就會出現(xiàn)在這里
結(jié)果會直接出現(xiàn)在文檔里,這里就是一個神奇的游樂場,代碼寫在這里,結(jié)果也打印在這里。想要運(yùn)行哪一個表達(dá)式,就把光標(biāo)移過去,按 M-z 或者 C-x C-e,結(jié)果就會被打印出來了。
如果輸入了錯誤的表達(dá)式,可能會觸發(fā)這樣的提示:

這里的意思是出了錯誤,并且提供了幾種處理方式,我建議直接終止當(dāng)前的命令,返回原來的模式。按n,不啟動debugger,然后輸入(RESTART 1),這同樣是一個表達(dá)式,按M-z執(zhí)行,這樣就跳出了異常處理的模式。

語法說明
//Scheme的表達(dá)式
(<operator> <operands...>)
對于Scheme,表達(dá)式由一對括號、以及里面的操作符(operator)和操作數(shù)(operand)構(gòu)成。其中操作符出現(xiàn)在最左邊,操作數(shù)依次出現(xiàn),與操作符要用空格隔開。操作數(shù)的數(shù)目是由操作符決定的。在Scheme里面,四則運(yùn)算的操作符,可以是2個,也可以是多個,例如:
(+ 1 2 3 4 5)
(- 10 1 2 3)
(* 3 3 3)
(/ 8 2 2)
這些都是合法的表達(dá)式,可以得到正確的結(jié)果。你可能會覺得奇怪,為什么要用這么一種違背直覺的寫法,這種寫法的一個好處就是可以很緊湊地書寫表達(dá)式,不必重復(fù)操作符。
(RESTART 1)
這也是一個表達(dá)式,RESTART就是一個操作符,1是它的操作數(shù)。它的功能就是中止當(dāng)前的所有任務(wù),回到編輯模式。
不要忘記,在這個文檔編輯的環(huán)境里,執(zhí)行過的代碼可以被修改和再次執(zhí)行,只需要把光標(biāo)移過去,修改之后再按相應(yīng)的組合鍵就可以了。
表達(dá)式的復(fù)合
(+ (+ 1 2)
(- 5 3))
(/ (+ 4 6)
(- 5 3))
表達(dá)式的復(fù)合是很自然的事情,SICP書中詳細(xì)地討論了Scheme內(nèi)部是怎樣完成復(fù)合運(yùn)算的,但是我覺得還是不要涉及那么多細(xì)節(jié)了吧。簡單說來,它先計(jì)算內(nèi)部表達(dá)式的值,然后用它代替這個表達(dá)式,于是復(fù)雜的表達(dá)式就變成了簡單表達(dá)式。
(+ (+ 1 2)
(- 5 3))
變成了
(+ 3
2)
得到
5
對于符合表達(dá)式的寫法的建議:
雖然Scheme不關(guān)心你是怎樣排版你的程序,但是出于可讀性的考慮,最好把同一層級的元素放在相同的縮進(jìn)位置。
(operator1 operand1
operand2
(operator2 operand2_1
operand2_2)
operand3)
依此類推。對于縮進(jìn),可以在按Enter換了一行之后,按Tab,Edwin有智能縮進(jìn)的功能, 最后不要忘記括號要成對,不然可沒辦法寫出正確的表達(dá)式哦。
小結(jié)
于是到這里,我們就學(xué)完了Scheme的最基本的組成單元。
留個作業(yè)吧
- 用Scheme寫幾個表達(dá)式,簡單的或者復(fù)合的,求值。
- 嘗試用文中給出的幾個組合鍵進(jìn)行刪除,復(fù)制,剪切,粘貼等操作,熟悉Edwin的工作方式。
下節(jié)會講如何自己定義簡單的操作符,敬請期待啦。