讓我們把Scheme解釋器當作計算器來使用。它比Windows附帶的計算機方便多了。
點擊?開始
?→?所有程序
?→?MIT Scheme
?→?Scheme
?來啟動Scheme解釋器以及如下圖所示的控制臺。
首先,讓我們計算1加2的值,在提示符中輸入(+ 1 2)
:
1 ]=> (+ 1 2)
;Value: 3
1 ]=>
解釋器返回3作為答案。請注意以下三點:
(+ 1 2)
代表步驟1+2
。+
首先出現(xiàn),然后緊跟兩個參數(shù):1
和2
.讓我們來詳細地分析計算過程。在這個函數(shù)中,當所有的參數(shù)被求值后,計算開始處理。對參數(shù)的求值順序是沒有被規(guī)范的,也就是說,參數(shù)并不是總是會從左到右求值。
+
被求值為加法過程。僅在前端輸入+
,解釋器會返回:[arity-dispatched-procedure 1]
?這表明+
是代表“過程1”的一個符號1
求值得到1
。通常來說,對布爾值,數(shù)字,字符以及字符串求值的結(jié)果就是它們本身。另一方面,對符號求值的結(jié)果可能是一些它的東西。2
求值得到2
。(+ 1 2)
求值得到3并跳出括號。在Scheme中,求得的值會跳出括號外,并且這個值(表達式的最終值)會被打印到前端。函數(shù)+
可以接受任意多的參數(shù)。
(+) ;→ 0
(+ 1) ;→ 1
(+ 1 2) ;→ 3
(+ 1 2 3) ;→ 6
Scheme(以及大多數(shù)Lisp方言)都可以處理分數(shù)。
函數(shù)exact->inexact
?用于把分數(shù)轉(zhuǎn)換為浮點數(shù)。Scheme也可以處理復數(shù)。復數(shù)是形如a+bi
的數(shù),此處a
稱為實部,b
稱為虛部。+
、-
、*
和/
分別代表加、減、乘、除。這些函數(shù)都接受任意多的參數(shù)。
例:
(- 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+39) * (53-45)
- (1020 / 39) + (45 * 2)
- 求和:39, 48, 72, 23, 91
- 求平均值:39, 48, 72, 23, 91(結(jié)果取為浮點數(shù))
quotient
用于求商數(shù)(quotient)。remainder
和modulo
用于求余數(shù)(remainder)。sqrt
用于求參數(shù)的平方根(square root)。(quotient 7 3) ;→ 2
(modulo 7 3) ;→ 1
(sqrt 8) ;→ 2.8284271247461903
數(shù)學上的三角函數(shù),諸如sin
,cos
,tan
,asin
,acos
和atan
都可以在Scheme中使用。atan
接受1個或2個參數(shù)。如果期望atan
的結(jié)果是1/2 π,就使用第二個參數(shù)指明使用弧度制。
(atan 1) ;→ 0.7853981633974483
(atan 1 0) ;→ 1.5707963267948966
指數(shù)通過exp
函數(shù)運算,對數(shù)通過log
函數(shù)運算。a
的b
次冪可以通過(expt a b)
來計算。
練習2
使用Scheme解釋器求解下列式子:
- 圓周率π。
- exp(2/3)。
- 3的4次冪。
- 1000的對數(shù)
本章中,我們已經(jīng)將Scheme解釋器當作計算器來使用。這會讓你快速上手Scheme。我會在下個章節(jié)講解Scheme的數(shù)據(jù)類型‘表’。
;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
;1
(* 4 (atan 1.0)) ;? 3.141592653589793
;2
(exp 2/3) ;? 1.9477340410546757
;3
(expt 3 4) ;? 81
;4
(log 1000) ;? 6.907755278982137
更多建議: