-
Scheme
(計算機程序語言)
鎖定
Scheme 編程語言是一種Lisp方言,誕生於1975年,由MIT的 Gerald J. Sussman 和 Guy L. Steele Jr.完成。它是現代兩大Lisp方言之一;另一個方言是Common Lisp。
- 中文名
- Scheme語言
- 外文名
- Scheme Programming Language
- 誕生於
- 1975年
- 完 成
- MIT
Scheme內容簡介
Lisp 語言歷史悠久,在計算機程序語言裏,年齡僅次於Fortran。二十世紀五十年代,計算機科學家先是發明了針對數字計算的 Fortran 語言,後來針對符號計算,由MIT 的John McCarthy於1960年開發出了Lisp (list processing)語言。該語言起初為表處理而設計,後來廣泛用於人工智能。Lisp 程序中充滿了一對對嵌套的小括號,這些嵌套的符號表達式體現了遞歸。遞歸是數學上的基本概念之一,從遞歸理論出發,一切可以計算的函數最終都可以劃歸為幾種基本的遞歸函數的種種組合。
1994年時眾多Lisp版本得到了相當的統一,統一之後的版本稱為Common LISP。Common Lisp帶有龐大的函數庫,語言的規範長達千頁以上,包括面向對象的 CLOS。
Scheme語言的規範很短,總共只有50頁,甚至連Common Lisp 規範的索引的長度都不到,但是卻被稱為是現代編程語言王國的皇后。它與以前和以後的 Lisp 實現版本都存在一些差異。Scheme易學易用。
Scheme語法定義
let表達式語法糖果
語法:(let ((var val) ...) exp1 exp2 ...)
説明:let表達式是 lambda 表達式的語法,即:(let ((var val) ...) exp1 exp2 ...),為 ((lambda (var ...) exp1 exp2) val ...)
示例:
(let ((x 2) (y 3)) (+ x y))
; 先綁定:x=2,y=3,再計算x+y的值,結果為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 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 表達式和函數定義
語法:(lambda (var ...) exp1 exp2 ...)
示例:
((lambda (x) (+ x x)) (* 3 4)) ; return 24
在let表達式中定義函數。
Scheme語言中,函數作為一種數據類型,通過賦值語句,將lambda表達式賦值給相應的函數。
示例:
(let ((double (lambda (x) (+ x x))))
(list (double (* 3 4))
(double (/ 99 11))
(double (- 2 7)))) ; return (24 18 -10)
説明:let表達式將lambda定義的函數賦值給double,參數是x,返回 x+x。接下來分別三次調用 double 函數,並將結果以列表形式返回。list表達式負責生成列表。
用define全局定義表達式來定義函數。
用 let 定義的函數只能在 let表達式中有效,如果想定義在整個程序中有效的函數定義,需要用到全局定義表達式——define。
示例:
(define double (lambda (x) (+ x x)))
(double 12) ; return 24
(double (* 3 4)) ; return 24
説明:define表達式定義了全局有效的函數 double。兩次調用double的返回值都是 24。
定義函數的簡寫
用 define 定義的函數的語法可以簡化,即將 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
説明:本例是前一個例子的簡化版本,更簡潔明瞭。
Scheme主要特點
括號嵌套
語法簡潔
Scheme語言的規範很短,總共只有50頁。
一個函數(Function)是這個編程語言中所謂的第一等的公民。也就是説函式可以像一個 int 或者 float 一樣被很方便的傳遞來傳遞去。這也就是所謂“Functional編程語言”中,Functional 一詞的由來。
支持尾遞歸
提高了遞歸效率
continuation
可移植性好
數字
下面都是合法的數字表示方法:47,1/3,2.3,4.3e14,1+3i。
字符
字符前面需要用#\做前綴。如下面都是合法字符:
#\a #\A #\b #\B #\space #\newline
字符串
由雙引號括起來的字符組成字符串。如:"A little string"
布爾值
布爾值True和False分別用 #t 和 #f 表示。
列表
數組(vector)
用#為前綴,如:#(1 2 "string" #\x 5)
函數(或稱為過程)
把函數作為一種數據類型,是包括Scheme語言在內的Lisp的特色。
符號
符號除了不能夠以數字開頭的任何字符可組成符號。如:Symbols: this-is-a-symbol foo a32 c$23*4&7+3-is-a-symbol-too!
(+ 3 1) ;return 4
Scheme表達式
常量表達式返回本身的值。如:
⒊14 ; 返回 3.14
#t ; 返回布爾值 #t
#\c ; 返回字符 #\c
"Hi!" ; 返回字符串 "Hi!"
Scheme引用
語法:(quote obj) 或者簡寫為 'obj
(+ 2 3) ; 返回 5
'(+ 2 3) ; 返回列表 (+ 2 3)
(quote (+ 2 3)) ; 返回列表 (+ 2 3)
Scheme記法
Scheme的表達式的寫法有些特別,表達式用括號括起來。括號裏面的第一個出現的是函數名或者操作符,其它是參數。Scheme的這種表達式寫法可以叫做前置式。下面是一些Scheme的表達式的例子以及其對應的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順序計算
語法:(begin exp1 exp2 ...)
説明:順序執行表達式 exp1,exp2,...,返回最後一個表達式的結果
示例:
(define x 3)
(begin
(set! x (+ x 1))
(+ x x)) ; 返回結果 8
主要的Scheme環境有:Racket、MIT Scheme、Scheme48、Chez Scheme
- 參考資料
-
- 1. Teach Yourself Scheme in Fixnum Days .Teach Yourself Scheme in Fixnum Days.2004[引用日期2013-01-31]