Scheme簡明教程1-序及進入Scheme編程

來源:互聯網
上載者:User
Scheme簡明教程

序言:

這是一份Scheme程式設計語言的入門教程。旨在作為一份快速上手指南,以便初學者在步入更廣更深的正式課程前可以擷取該語言上手所需的應用知識(入門後,請讀者更深入的學習Scheme)。

本教程將引導讀者寫出簡明實用的Scheme代碼。儘管不會覆蓋到Scheme語言的方方面面,但我們也不會避開這門語言中的很有用處但讓人覺得難理解、生澀、罕見、不標準、甚至奇怪的部分。比如call-with-current-continuation、系統介面和多樣化的方言等。我們會基於解決問題來做一些討論,但不會是單純的探索高深的純語言理論。我因此刪除了許多經典的Scheme指南。所以本教程不會出現深層次的教學方法、不會詳細的關注Scheme語義、沒有中繼資料解釋、沒有對深層次的實現的討論、也沒有對Scheme語言優點的評價。這並不是說這些內容不重要,但它們對想快速上手的初學者來說沒有實際意義。

到底能夠有多快?我不確定是否有人能夠在三周時間內自學完Scheme,但我確實聽說了Scheme的入門應該只需要半天的工夫。Scheme標準手冊,雖然很細至完備,但也只不過只有50頁。最終在某個下午,你會完全理解Scheme和它的標準,但在那之前沒有人會知道需要度過多少個讓人覺得滿頭霧水的下午。希望讀者能儘快領悟,這就是我的簡明教程。

Acknowledgment: Matthias Felleisen , Matthew Flatt (鳴謝部分翻譯省略)

 

開發環境:譯者用的是Berkeley大學的STK環境,可在附屬檔案中尋找。

Berkeley大學的Scheme課程資料

MIT大學的Scheme課程資料


第一章         進入Scheme編程

按慣例,我們總是以一個可以輸出”Hello, World!”字串的控制台程式開始。開啟你最習慣的文字編輯器,用以下內容建立一個名為hello.scm的檔案:

;The first program
 
(begin
  (display"Hello, World!")
  (newline))

第一行是備註陳述式,當Scheme遇到一個分號,它將忽略該分號以及這一行分號之後的語句。

begin是Scheme中一種用來標明語句段開始的語句。這個語句段中有兩個子語句段。第一段調用了display過程來向控制台輸出它的參數(“Hello, World!”字串)。它後面調用newline 過程輸出一個斷行符號換行。

要運行這段程式,首先得啟動你的Scheme。通常在作業系統的命令運行視窗直接輸入執行Scheme環境啟動程式就可以了。比如MzScheme,只要在命令視窗中輸入運行mzscheme就可以了。(如果是STK-Win32 ,只需要雙擊運行MS-Win32下的相應bat檔案就行了)

這將啟動Scheme的命令提示行程式,它將讀取你的輸入並執行,然後會將結果列印在命令視窗上,再等待接程式的輸入。由此我們通常稱之為 輸入-執行-列印 迴圈。這和作業系統的命令列提示沒什麼區別,它也是讀取你的命令並執行,然後再等待更多的命令被輸入。就像作業系統的命令提示行一樣,Scheme的命令列有它自己的提示符,通常是 > 符號,也可能是其它類似符號。

在Scheme命令提示字元後輸入命令載入hello.scm檔案。在提示符後輸入:

(load"hello.scm")

Scheme將執行hello.scm檔案中的程式,輸出Hello, World!和斷行符號換行。之後又會回到命令提示字元,等待新輸入。

有這樣一個勤勞的命令提示行,你沒有必要總是把程式寫到檔案再載入。有時候可以更簡單一些,尤其是當你在分析代碼的時候,可以直接在命令提示字元後直接輸入運算式來查看結果。比如直接在命令提示字元輸入

(begin (display"Hello, World!")
       (newline))

馬上在提示符後得到輸出結果。

Hello, World! 

 

實際上你可以更簡單的直接在命令列中輸入”Hello, World!”字串,然後你可以立刻得輸出的字串結果,

"Hello, World!"
因為命令列會馬上運算字面量 "Hello, World!" 得到 "Hello, World!"。(注意結果有雙引號)

除了第二種方式產生的結果具有雙引號外,兩段程式還有一個標誌性的區別。第一段(用begin開頭的)並沒有做任何的運算,而顯示的結果是display和newline過程的副作用向標準輸出寫出來的。第二段程式,"Hello, World!"運算得到的結果在這個情況下和這個字串本身是一致的。

以後,我們會使用標記 => 來表示運算。就像這樣 E => v 表示語句段E 運算得到結果值為v。例如,
       (begin

  (display "Hello, World!")

  (newline))

=>
(沒有結果),儘管它有輸出 Hello, World!到標準輸出的副作用。而另一個程式段,
    "Hello, World!"

=>  "Hello, World!"

在上面兩種代碼情況下,我們運行完後還是停在命令提示字元後。如果要退出Scheme,輸入
    (exit)
程式碼片段,這樣會退出Scheme命令列。

Scheme命令列非常便於互動測試程式和程式片段。然而這絕不是必須的。你當然可以堅持傳統的方式完全在檔案中來建立程式,然後用Scheme來執行它們但並不使用任何明顯的命令列。在MzScheme中,例如你可以在作業系統的命令列中這樣輸
       mzscheme –r hello.scm
這樣不需要和Scheme命令列打交道就可以產生問候的結果了。在問候結果產生後,mzscheme將會退回作業系統的命令提示。這幾乎就像是你直接寫了echo Hello , World!

你甚至可以把hello.scm當成是一個系統命令來看待(一個核心指令碼或批次檔),但具體得等到第十六章來講解。

譯:heros

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.