第一章:進入Scheme
====================
經典的第一個程序通常是把一個`"Hello world!"`顯示在控制臺上。用你最喜歡的編輯器,創建一個名為`hello.scm`的文件,并在里面輸入以下內容:
```scheme
;The first program
(begin
(display "Hello, World!")
(newline))
```
第一行是一個注釋,當Scheme發現一個分號,就把分號和這一行分號后面的文字都忽略了。
`begin`語句(原文為form)是Scheme用來包括子語句的方式,這個例子里有兩個子語句。第一句調用了`display`過程,該過程會輸出它的參數(字符串`"Hello, World!"`)到控制臺(或者叫“標準輸出”)后面一句調用了`newline`過程,該過程輸出一個換行。
想要運行這個程序首先需要啟動Scheme,通常只需要在你操作系統的命令行下面輸入你的Scheme可執行程序的名字即可。如果你用的是MzScheme,你需要在操作系統提示符后面輸入:
```
mzscheme
```
這將調用Scheme listener程序,這個程序讀取你的輸入,求值,打印結果(如果有的話),然后等待你的下一次輸入。由此這通常被稱為“讀取-求值-打印”的循環。注意這和你操作系統的命令行沒有太大區別,操作系統的命令行也讀取你的命令,執行,然后等待其他命令。和操作系統一樣,Scheme listener有它自己的提示符——通常是`>`,但也可能是其他的東西。
在Scheme listener里,加載文件`hello.scm`。直接運行下面的語句即可:
```
(load "hello.scm")
```
Scheme現在執行hello.scm文件的內容,輸出`Hello, World!`接著后面是一個換行符。然后你又得到了命令提示符,可以輸入更多命令。
現在由于你有一個很好用的listener,所以你用不著每次把你的程序寫到一個文件里然后`load`它,有時候,特別是當你想試試某些東西的時候,直接在listener的提示符后面輸入表達式然后看結果會更簡單。比如,在Scheme的提示符下輸入:
```
(begin (display "Hello, World!")
(newline))
```
會得到:
```
Hello, World!
```
事實上,你可以簡單地在提示符后面輸入`"Hello, World!"`然后你可以得到作為結果的字符串:
```
"Hello, World!"
```
因為這是listener對`"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中,例如你可以在操作系統的命令行中這樣輸
```scheme
mzscheme –r hello.scm
```
這樣不需要和Scheme命令行打交道就可以產生問候的結果了。
在問候結果產生后,mzscheme將會退回操作系統的命令提示。
這幾乎就像是你直接寫了`echo Hello , World!`
你甚至可以把`hello.scm`當成是一個系統命令來看待(一個內核腳本或批處理文件),但具體得等到第十六章來講解。