Scheme语言简单介绍
一年前事實(shí)上有時(shí)間看完SICP這本書(shū),后來(lái)由于種種原因,一直沒(méi)有繼續(xù)再學(xué)。由于SICP中使用Scheme確實(shí)應(yīng)用不多。在Java,C++的語(yǔ)言眼里,Scheme確實(shí)非常另類。現(xiàn)在MIT已經(jīng)放棄了使用Scheme作為SICP的教學(xué)語(yǔ)言而轉(zhuǎn)向python之際,我在此開(kāi)始學(xué)習(xí)這本書(shū)與這門語(yǔ)言的學(xué)習(xí)。SICP主要使用Scheme語(yǔ)言來(lái)解決計(jì)算機(jī)科學(xué)中的一些問(wèn)題。為了督促自己,每天都能學(xué)習(xí)。積小流而成江海,把自己的學(xué)習(xí)過(guò)程放在這里,以供自己復(fù)習(xí)。
本系列主要包含兩部分Scheme語(yǔ)言層面的問(wèn)題及SICP中的課程方面,兩個(gè)部分相輔相成。今天開(kāi)始Scheme語(yǔ)言的第一節(jié)。
Scheme簡(jiǎn)單介紹
Scheme語(yǔ)言是Lisp語(yǔ)言的一種變種,是一種表處理語(yǔ)言。其語(yǔ)法簡(jiǎn)單,easy學(xué)習(xí),能夠使使用者專著于解決這個(gè)問(wèn)題而非語(yǔ)言本身。
1.1 基本類型
scheme支持的基本數(shù)據(jù)類型有整數(shù),實(shí)數(shù),分?jǐn)?shù),復(fù)數(shù),對(duì)這些基本類型能夠使用這些類型之上的各種操作如+-*/%等等。字符串””,記號(hào)quote。對(duì)于quote,(quote exp)表示exp為記號(hào),不進(jìn)行解析。常寫(xiě)作’exp。
List有兩種類型,一種結(jié)尾元素為空表(),(list ‘a(chǎn) ‘b ‘c),等價(jià)與(cons ‘a(chǎn) (cons ‘b (cons ‘c ‘() ))),還有一種表為不正常表,表尾為結(jié)尾元素,(cons ‘a(chǎn) (cons ‘b ‘c)) 這樣的表的值是(a b.c),.表示其后元素為表的結(jié)尾元素。
表的操作
car:取表的第一個(gè)元素
cdr:表在取car后的其余部分,對(duì)于正常表,其結(jié)果是一個(gè)表,對(duì)非正常表,結(jié)果可能是一個(gè)元素。
cons:構(gòu)造表,假設(shè)第二個(gè)參數(shù)是表,則將第一個(gè)參數(shù)作為總體放在第二個(gè)參數(shù)的表中。
List:構(gòu)造表,將各個(gè)參數(shù)做為總體放在一個(gè)表中。
構(gòu)造正常表的還有一種方法:使用quote即’ 如’(a b c)。
1.2 變量綁定
( let ((arg1 val1) (argv2 val2)? …) exp1 exp2 … )
變量綁定僅僅在當(dāng)前的let表達(dá)式中有效,比如(let ((+ *)) (+ 2 3)? =6)
Let操作能夠嵌套運(yùn)行,但綁定僅僅對(duì)let內(nèi)部可見(jiàn),對(duì)外層let不可見(jiàn)。
1.3 lambda表達(dá)式
(Lambda (arg1 …) exp1 exp2)
從演算來(lái)看,(let ((var value) …) exp1 exp2…) == ((lambda (var …) exp1 exp2 …) value … )
對(duì)于Lambda函數(shù)的參數(shù)
假設(shè)形參僅僅有一個(gè),則能夠有隨意數(shù)量的實(shí)參,全部實(shí)參被格式化為一個(gè)list傳給函數(shù)。
假設(shè)形參list是不正常的list的形式,則形參相應(yīng)的實(shí)參被一一映射,而后的實(shí)參被格式化成一個(gè)list傳給.后的形參,這也意味著,實(shí)參個(gè)數(shù)必須保證形參個(gè)數(shù)。假設(shè)形參是一個(gè)正常的list,則實(shí)參必須被一一映射。
因此((lambda (x) x) ‘a(chǎn)) = a 而((lambda x? x) ‘a(chǎn)) = (a)
1.4 define定義
Define定義的是全局可見(jiàn)的,在scheme中,能夠定義一個(gè)過(guò)程,當(dāng)中使用一個(gè)沒(méi)有定義的過(guò)程,這不會(huì)引起錯(cuò)誤,但假設(shè)你使用它,就會(huì)出現(xiàn)錯(cuò)誤,除非你補(bǔ)充定義了所引用的過(guò)程。
(define mylist (lambda x? x))
1.5 條件表達(dá)式
If表達(dá)式:(if cond1 result1 result_other)
Cond表達(dá)式:( cond? (test1? exp1) (test2 exp2) … (else expn ))也能夠羅列全部,而不用else
Or表達(dá)式:(or exp1 exp2 …)
Not表達(dá)式:(not exp)使得#f #t之間轉(zhuǎn)換。
關(guān)于類型推斷:
(type? Var)能夠得出var是否是type類型的,典型的類型有null,number,string,list,pair…
Eqv?能夠推斷兩個(gè)值是否相等
1.6 遞歸過(guò)程
一個(gè)過(guò)程定義中調(diào)用了自己,遞歸過(guò)程一般分兩部分,終止部分與遞歸部分。
1.7 map操作
( map fun argv …)
映射操作將fun應(yīng)用到agv..的各個(gè)元素上,并返回一個(gè)list。以下是兩個(gè)演示樣例:
(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!用來(lái)設(shè)置變量的值。變量能夠是全局的,也能夠是局部的。Set!使用的變量必須是事先定義過(guò)的。能夠是let也能夠是define。
總結(jié)
以上是生活随笔為你收集整理的Scheme语言简单介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Quartz Cron 表达式
- 下一篇: qq个性签名文艺范