[TOC=2]
## 2.1?簡介
讓我們把Scheme解釋器當作計算器來使用。它比Windows附帶的計算機方便多了。
## 2.2?將Scheme作為一個計算器
點擊?`開始`?→?`所有程序`?→?`MIT Scheme`?→?`Scheme`?來啟動Scheme解釋器以及如下圖所示的控制臺。

首先,讓我們計算1加2的值,在提示符中輸入`(+ 1 2)`:
~~~
1 ]=> (+ 1 2)
;Value: 3
1 ]=>
~~~
解釋器返回3作為答案。請注意以下三點:
1. 一對括號代表了一次計算的步驟。本例中,`(+ 1 2)`代表步驟`1+2`。
2. 左括號后緊跟著一個函數的名字,然后是參數。Scheme中大多數的操作符都是函數。在本例中,函數`+`首先出現,然后緊跟兩個參數:`1`和`2`.
3. 標記的分隔符是**空格(Space)**、**制表符(Tab)**或者**換行符(Newline)**。逗號和分號不是分隔符。
讓我們來詳細地分析計算過程。在這個函數中,當所有的參數被求值后,計算開始處理。對參數的求值順序是沒有被規范的,也就是說,參數并不是總是會從左到右求值。
* 符號`+`被求值為加法過程。僅在前端輸入`+`,解釋器會返回:`[arity-dispatched-procedure 1]`?這表明`+`是代表“過程1”的一個符號
* 對`1`求值得到`1`。通常來說,對布爾值,數字,字符以及字符串求值的結果就是它們本身。另一方面,對符號求值的結果可能是一些它的東西。
* 對`2`求值得到`2`。
* 最后,對`(+ 1 2)`求值得到3并跳出括號。在Scheme中,求得的值會跳出括號外,并且這個值(表達式的最終值)會被打印到前端。
函數`+`可以接受任意多的參數。
~~~
(+) ;→ 0
(+ 1) ;→ 1
(+ 1 2) ;→ 3
(+ 1 2 3) ;→ 6
~~~
## 2.3?四種基本算術操作
Scheme(以及大多數Lisp方言)都可以處理分數。
函數`exact->inexact`?用于把分數轉換為浮點數。Scheme也可以處理復數。復數是形如`a+bi`的數,此處`a`稱為實部,`b`稱為虛部。`+`、`-`、`*`和`/`分別代表加、減、乘、除。這些函數都接受任意多的參數。
例:
~~~
(- 10 3) ;→ 7
(- 10 3 5) ;→ 2
(* 2 3) ;→ 6
(* 2 3 4) ;→ 24
(/ 29 3) ;→ 29/3
(/ 29 3 7) ;→ 29/21
(/ 9 6) ;→ 3/2
(exact->inexact (/ 29 3 7)) ;→ 1.380952380952381
~~~
括號可以像下面這樣嵌套:
~~~
(* (+ 2 3) (- 5 3)) ;→ 10
(/ (+ 9 1) (+ 2 3)) ;→ 2
~~~
形如這些由**括號**、**標記(token)**以及**分隔符**組成的式子,被稱為**S-表達式**。
> 練習 1
>
> 使用Scheme解釋器計算下列式子:
>
> 1. (1+39) * (53-45)
> 2. (1020 / 39) + (45 * 2)
> 3. 求和:39, 48, 72, 23, 91
> 4. 求平均值:39, 48, 72, 23, 91(結果取為浮點數)
## 2.4?其它算術操作
### 2.4.1?quotient,remainder,modulo和sqrt
* 函數`quotient`用于求**商數(quotient)**。
* 函數`remainder`和`modulo`用于求**余數(remainder)**。
* 函數`sqrt`用于求參數的**平方根(square root)**。
~~~
(quotient 7 3) ;→ 2
(modulo 7 3) ;→ 1
(sqrt 8) ;→ 2.8284271247461903
~~~
### 2.4.2?三角函數
數學上的三角函數,諸如`sin`,`cos`,`tan`,`asin`,`acos`和`atan`都可以在Scheme中使用。`atan`接受1個或2個參數。如果期望`atan`的結果是1/2 π,就使用第二個參數指明使用弧度制。
~~~
(atan 1) ;→ 0.7853981633974483
(atan 1 0) ;→ 1.5707963267948966
~~~
### 2.4.3?指數和對數
指數通過`exp`函數運算,對數通過`log`函數運算。`a`的`b`次冪可以通過`(expt a b)`來計算。
> 練習2
>
> 使用Scheme解釋器求解下列式子:
>
> 1. 圓周率π。
> 2. exp(2/3)。
> 3. 3的4次冪。
> 4. 1000的對數
## 2.5?小結
本章中,我們已經將Scheme解釋器當作計算器來使用。這會讓你快速上手Scheme。我會在下個章節講解Scheme的數據類型‘表’。
## 2.6?習題解答
### 2.6.1?答案1
~~~
;1
(* (+ 1 39) (- 53 45)) ;? 320
;2
(+ (/ 1020 39) (* 45 2)) ;? 1510/13
;3
(+ 39 48 72 23 91) ;? 273
;4
(exact->inexact (/ (+ 39 48 72 23 91) 5)) ;? 54.6
~~~
### 2.6.2?答案2
~~~
;1
(* 4 (atan 1.0)) ;? 3.141592653589793
;2
(exp 2/3) ;? 1.9477340410546757
;3
(expt 3 4) ;? 81
;4
(log 1000) ;? 6.907755278982137
~~~