WIKI使用導(dǎo)航
站長百科導(dǎo)航
站長專題
- 網(wǎng)站推廣
- 網(wǎng)站程序
- 網(wǎng)站賺錢
- 虛擬主機(jī)
- cPanel
- 網(wǎng)址導(dǎo)航專題
- 云計(jì)算
- 微博營銷
- 虛擬主機(jī)管理系統(tǒng)
- 開放平臺
- WIKI程序與應(yīng)用
- 美國十大主機(jī)
Scheme

Scheme,一種多范型的編程語言,它是兩種Lisp的一個(gè)現(xiàn)代變種。它是由Guy L. Steele跟Gerald Jay Sussman在1970年代發(fā)展出來。Scheme也是第一個(gè)使用靜態(tài)而非動態(tài)變量區(qū)域的Lisp方言。Scheme的哲學(xué)思想是:設(shè)計(jì)計(jì)算機(jī)語言不應(yīng)該進(jìn)行功能(feature)的堆砌,而應(yīng)該盡可能減少弱點(diǎn)(weakness)和限制(restriction),使剩下的功能顯得必要。Scheme語言的規(guī)范很短,總共只有50頁,甚至連Common Lisp 規(guī)范的索引的長度都不到,但是卻被稱為是現(xiàn)代編程語言王國的皇后。它與以前和以后的 Lisp 實(shí)現(xiàn)版本都存在一些差異,但是卻易學(xué)易用。
Scheme的一個(gè)主要特性是可以像操作數(shù)據(jù)一樣操作函數(shù)調(diào)用。Scheme 是 MIT 在70年代創(chuàng)造出來,其的主要目的是訓(xùn)練人的機(jī)器化思維。以其簡潔的語言環(huán)境和大量的腦力思考而著稱。
正由于lisp語言的歷史悠久,所以最初接觸scheme的語法,我們常會感到一頭霧水。但是這種語言自有它獨(dú)特的魅力。
Scheme特點(diǎn)[ ]
- 括號嵌套
Lisp 程序中充滿了一對對嵌套的小括號,這些嵌套的符號體現(xiàn)了最基本的數(shù)學(xué)思想——遞歸。
- 語法簡潔
Scheme語言的規(guī)范很短,總共只有50頁。
- 函數(shù)編程語言
一個(gè)函數(shù)(Function)是這個(gè)編程語言中所謂的第一等的公民。也就是說函式可以像一個(gè) int 或者 float 一樣被很方便的傳遞來傳遞去。這也就是所謂“Functional 編程語言”中,F(xiàn)unctional 一詞的由來。
- 自動內(nèi)存管理
自動內(nèi)存管理可不是JAVA的專利,Scheme也享有自動內(nèi)存管理機(jī)制。
- 支持尾遞歸
- 提高了遞歸效率
支持高級控制結(jié)構(gòu)continuation
- 可移植性好
Scheme開發(fā)的程序有很好的可移植性,這是由于Scheme是一種解釋語言,在不同的平臺都可以有相應(yīng)的解釋器。
- 適合作為腳本語言和嵌入語言
由于scheme語法簡潔,一個(gè)Scheme解釋器可以非常的小巧。Scheme可以作為腳本語言而內(nèi)嵌于一些工具之中,如:GNU Emacs。
- 關(guān)鍵字對大小寫不敏感
Scheme數(shù)據(jù)結(jié)構(gòu)[ ]
- 數(shù)字
下面都是合法的數(shù)字表示方法:47,1/3,2.3,4.3e14,1+3i。
- 字符
字符前面需要用#\做前綴。如下面都是合法字符:
#\a #\A #\b #\B #\space #\newline
由雙引號括起來的字符組成字符串。如:"A little string"
- 布爾值
布爾值True和False分別用 #t 和 #f 表示。
- 列表
用圓括號括起來的,可以包含任何數(shù)據(jù)類型的稱為列表。如: (a little (list of) (lists))
- 數(shù)組(vector)
用#為前綴,如: #(1 2 "string" #\x 5)
- 函數(shù)(或稱為過程)
把函數(shù)作為一種數(shù)據(jù)類型,是Scheme語言的特色。
- 符號
符號除了不能夠以數(shù)字開頭的任何字符可組成符號。如:Symbols: this-is-a-symbol foo a32 c$23*4&7+3-is-a-symbol-too!
Scheme注釋[ ]
分號開始一段注釋。如:
(+ 3 1) ; return 4
Scheme常量表達(dá)式[ ]
常量表達(dá)式返回本身的值。如:
3.14 ; 返回 3.14 #t ; 返回布爾值 #t #\c ; 返回字符 #\c "Hi!" ; 返回字符串 "Hi!"
Scheme引用(Quotation)[ ]
語法: (quote obj) 或者簡寫為 'obj (+ 2 3) ; 返回 5 '(+ 2 3) ; 返回列表 (+ 2 3) (quote (+ 2 3)) ; 返回列表 (+ 2 3)
Scheme表達(dá)式記法[ ]
Scheme的表達(dá)式的寫法有些特別,表達(dá)式用括號括起來。括號里面的第一個(gè)出線的是函數(shù)名或者操作符,其它是參數(shù)。Scheme的這種表達(dá)式寫法可以叫做前置式。下面是一些Scheme的表達(dá)式的例子以及其對應(yīng)的C語言的寫法。
Scheme C ------------------------------------------------------------------ (+ 2 3 4) (2 + 3 + 4) (< low x high) ((low < x) && (x < high)) (+ (* 2 3) (* 4 5)) ((2 * 3) + (4 * 5)) (f x y) f(x, y) (define (sq x) (* x x)) int sq(int x) { return (x * x) }
Scheme對象綁定、賦值和函數(shù)定義[ ]
let 表達(dá)式語法糖果
語法: (let ((var val) ...) exp1 exp2 ...)
說明:let 表達(dá)式是 lambda 表達(dá)式的語法糖果,即:(let ((var val) ...) exp1 exp2 ...),為 ((lambda (var ...) exp1 exp2) val ...)
- 示例:
(let ((x 2) (y 3)) (+ x y))
- 先綁定: x=2, y=3,再計(jì)算x+y的值,結(jié)果為5。注意 (x 2) 和 (y 3) 外還有一層括號。
- 更多的示例:
(let ((f +)) (f 2 3)) ; return 5 (let ((f +) (x 2)) (f x 3)) ; return 5 (let ((f +) (x 2) (y 3)) (f x y)) ; return 5
- 用 define 綁定對象和 set! 賦值
- 語法:(define var exp) , (set! var exp)
- 說明:define綁定的對象在當(dāng)前作用域中有效。define 和 set! 的區(qū)別是define既能賦值又能定義變量,而set!只能對已經(jīng)定義的變量賦值。
- 示例:
(define a 1) a ; return 1 (set! a 2) a ; return 2 (let ((a 3)) a) ; return 3 a ; return 2 (let ((a 3)) (set! a 4) a) ; return 4 a ; return 2 (let ((a 3)) (define a 5) a) ; return 5 a ; return 2 (set! b 1) ; 錯誤,b尚未定義
- lambda 表達(dá)式和函數(shù)定義
- 語法:(lambda (var ...) exp1 exp2 ...)
- 說明:lambda 表達(dá)式用于定義函數(shù)。var ... 是參數(shù),exp1 exp2 ...是函數(shù)的執(zhí)行 部分。通常需要結(jié)合局部定義 let 或者全局定義表達(dá)式 define,再進(jìn)行函數(shù)調(diào)用。
- 示例:
((lambda (x) (+ x x)) (* 3 4)) ; return 24
- 說明:先用lambda定義了函數(shù),參數(shù)是x,函數(shù)返回x+x。同時(shí)該語句也完成了函數(shù)調(diào)用,實(shí)參是 12 (等于3*4),因此返回值是 24 (等于12+12)。
在let表達(dá)式中定義函數(shù)。
Scheme語言中,函數(shù)作為一種數(shù)據(jù)類型,通過賦值語句,將lambda表達(dá)式賦值給相應(yīng)的函數(shù)。
- 示例:
(let ((double (lambda (x) (+ x x)))) (list (double (* 3 4)) (double (/ 99 11)) (double (- 2 7)))) ; return (24 18 -10)
- 說明:let表達(dá)式將lambda定義的函數(shù)賦值給double,參數(shù)是x,返回 x+x。接下來分別三次調(diào)用 double 函數(shù),并將結(jié)果以列表形式返回。list 表達(dá)式負(fù)責(zé)生成列表。
用define全局定義表達(dá)式來定義函數(shù)。
用 let 定義的函數(shù)只能在 let 表達(dá)式中有效,如果想定義在整個(gè)程序中有效的函數(shù)定義,需要用到全局定義表達(dá)式——define。
- 示例:
(define double (lambda (x) (+ x x))) (double 12) ; return 24 (double (* 3 4)) ; return 24
- 說明:define表達(dá)式定義了全局有效的函數(shù) double。兩次調(diào)用double的返回值都是 24。
定義函數(shù)的簡寫
用 define 定義的函數(shù)的語法可以簡化,即將 lambda 去掉。即將語法
(define var0 (lambda (var1 ... varn) e1 e2 ...)) 簡寫為: (define (var0 var1 ... varn) e1 e2 ...)
- 示例:
(define (double x) (+ x x)) (double 12) ; return 24 (double (* 3 4)) ; return 24
- 說明:本例是前一個(gè)例子的簡化版本。更簡介,明了。
Scheme順序計(jì)算表達(dá)式[ ]
- 語法:(begin exp1 exp2 ...)
- 說明:順序執(zhí)行表達(dá)式 exp1, exp2, ...,返回最后一個(gè)表達(dá)式的結(jié)果
- 示例:
(define x 3) (begin (set! x (+ x 1)) (+ x x)) ; 返回結(jié)果 8
- 說明:begin 表達(dá)式,依次先用set!表達(dá)式為x賦值為4,在運(yùn)算x+x,返回結(jié)果8。
主要的Scheme環(huán)境有:MIT Scheme、DrScheme