一年前事實上有時間看完SICP這本書,後來因爲種種緣由,一直沒有繼續再學。因爲SICP中使用Scheme確實應用很少。在Java,C++的語言眼裏,Scheme確實很是另類。如今MIT已經放棄了使用Scheme做爲SICP的教學語言而轉向python之際,我在此開始學習這本書與這門語言的學習。SICP主要使用Scheme語言來解決計算機科學中的一些問題。爲了督促本身,天天都能學習。積小流而成江海,把本身的學習過程放在這裏,以供本身複習。python
本系列主要包含兩部分Scheme語言層面的問題及SICP中的課程方面,兩個部分相輔相成。今天開始Scheme語言的第一節。函數
Scheme簡單介紹 學習
Scheme語言是Lisp語言的一種變種,是一種表處理語言。其語法簡單,easy學習,可以使使用者專著於解決這個問題而非語言自己。遞歸
1.1 基本類型 字符串
scheme支持的基本數據類型有整數,實數,分數,複數,對這些基本類型可以使用這些類型之上的各類操做如+-*/%等等。字符串」」,記號quote。對於quote,(quote exp)表示exp爲記號,不進行解析。常寫做’exp。string
List有兩種類型,一種結尾元素爲空表(),(list ‘a ‘b ‘c),等價與(cons ‘a (cons ‘b (cons ‘c ‘() ))),還有一種表爲不正常表,表尾爲結尾元素,(cons ‘a (cons ‘b ‘c)) 這樣的表的值是(a b.c),.表示其後元素爲表的結尾元素。class
表的操做
car:取表的第一個元素
cdr:表在取car後的其他部分,對於正常表,其結果是一個表,對非正常表,結果多是一個元素。
cons:構造表,假設第二個參數是表,則將第一個參數做爲整體放在第二個參數的表中。
List:構造表,將各個參數作爲整體放在一個表中。
構造正常表的還有一種方法:使用quote即’ 如’(a b c)。test
1.2 變量綁定
( let ((arg1 val1) (argv2 val2) …) exp1 exp2 … )
變量綁定僅僅在當前的let表達式中有效,好比(let ((+ *)) (+ 2 3) =6)
Let操做可以嵌套運行,但綁定僅僅對let內部可見,對外層let不可見。計算機科學
1.3 lambda表達式
(Lambda (arg1 …) exp1 exp2)
從演算來看,(let ((var value) …) exp1 exp2…) == ((lambda (var …) exp1 exp2 …) value … )
對於Lambda函數的參數
假設形參僅僅有一個,則可以有隨意數量的實參,所有實參被格式化爲一個list傳給函數。
假設形參list是不正常的list的形式,則形參相應的實參被一一映射,然後的實參被格式化成一個list傳給.後的形參,這也意味着,實參個數必須保證形參個數。假設形參是一個正常的list,則實參必須被一一映射。
所以((lambda (x) x) ‘a) = a 而((lambda x x) ‘a) = (a)
1.4 define定義
Define定義的是全局可見的,在scheme中,可以定義一個過程,當中使用一個沒有定義的過程,這不會引發錯誤,但假設你使用它,就會出現錯誤,除非你補充定義了所引用的過程。
(define mylist (lambda x x))變量
1.5 條件表達式
If表達式:(if cond1 result1 result_other)
Cond表達式:( cond (test1 exp1) (test2 exp2) … (else expn ))也可以羅列所有,而不用else
Or表達式:(or exp1 exp2 …)
Not表達式:(not exp)使得#f #t之間轉換。
關於類型推斷:
(type? Var)可以得出var是不是type類型的,典型的類型有null,number,string,list,pair…
Eqv?可以推斷兩個值是否相等
1.6 遞歸過程
一個過程定義中調用了本身,遞歸過程通常分兩部分,終止部分與遞歸部分。
1.7 map操做
( map fun argv …)
映射操做將fun應用到agv..的各個元素上,並返回一個list。如下是兩個演示樣例:
(map abs '(1 -2 3 -4 5 -6)) => (1 2 3 4 5 6)
(define trans
(lambda (lst)
(cons (map car lst) (map cdr lst))))
(trans '((a.1) (b.2) (c.3))) => ((a b c) 1 2 3)
1.8 賦值操做 Set!用來設置變量的值。變量可以是全局的,也可以是局部的。Set!使用的變量必須是事先定義過的。可以是let也可以是define。