Scheme 语言 编程思想下
在上篇的基础上介绍几种Scheme重要的用法
1、lambda:
lambda操作符定义一个匿名函数。比如(lambda (x) (* 2 x))定义了一个函数,返回参数x的倍数。操作符lambda后第一个子列表是参数列表,而第二个子列表是函数定义。定义了递加函数,并把它绑定到函数名1+上。。Scheme对函数名没有限制。事实上,Scheme对所有函数名一视同仁。规范里定义的函数没有特殊地位,我们完全可以用自己的函数定义取代。这相当于JavaScript语法: var increment = function(x){return x + 1;}。
举例:
(define (double a) (* a 2))
(define numbers (list 1 2 3 4))
(map (lambda (a) (* 2 a)) numbers)
定义仅返回lambda的函数。
(define (make->adder a) (lambda (b) (+ a b)))
(make-adder 2)
定义一个名为make-adder函数,带有一个参数a,返回一个匿名函数。
2、逻辑型(boolean):
逻辑型(boolean)最基本的数据类型,也是很多计算机语言中都支持的最简单的数据类型,只能取两个值:#t,相当于其它计算机语言中的 TRUE;#f,相当于其它计算机语言中的 FALSE。Scheme语言中的boolean类型只有一种操作:not。其意为取相反的值,即:
从上面的操作中可以看出来,只要not后面的参数不是逻辑型,其返回值均为#f。
例子:
(if (> (string-length "Hello,world") 10)
(display "True"))
3、列表:
列表是由多个相同或不同的数据连续组成的数据类型,它是编程中最常用的复合数据类型之一,很多过程操作都与它相关。以下是Guile中列表的定义和相关操作:
guile>(define la(list 1 2 3 4))
guile> (define la (list 1 2 3 4 ))
guile> la
(1 2 3 4)
guile> (length la) ; 取得列表的长度
4
guile> (list-ref la 3) ; 取得列表第3项的值(从0开始)
4
guile> (list-set! la 2 99) ; 设定列表第2项的值为99
99
guile> la
(1 2 99 4)
guile> (define y (make-list 5 6)) ;创建列表
guile> y
(6 6 6 6 6)
3、列表与pair 的关系
回过头来,我们再看看下面的定义:
guile> (define a (cons 1 (cons 2 (cons 3 '()))))
guile> a
(1 2 3)
由上可见,a本来是我们上面定义的点对,最后形成的却是列表。事实上列表是在点对的基础上形成的一种特殊格式
对比以下代码:
guile> (define ls (list 1 2 3 4))
guile> ls
(1 2 3 4)
guile> (list? ls)
#t
guile> (pair? ls)
#t
由此可见,list是pair的子类型,list一定是一个pair,而pair不是list。
guile> (car ls)
1
guile> (cdr ls)
(2 3 4)
其cdr又是一个列表,可见用于pair的操作过程大多可以用于list。
guile> (cadr ls) ; 此"点对"对象的cdr的car
2
guile> (cddr ls) ; 此"点对"对象的cdr的cdr
(3 4)
guile> (caddr ls) ; 此"点对"对象的cdr的cdr的car
3
guile> (cdddr ls) ; 此"点对"对象的cdr的cdr的cdr
pairs定义形成的列表图示如下:
4、向量(vector)
向量是一种非常好的类型,更是一种按整数来索引的对象,在空间占用上比同种元素的列表要少,
一般的列表表示:(1 2 3 4)
Vector(向量)表示为:#(1 2 3 4 )
可以正常定义:(define v (vector 3 4 5))
也可以直接定义:(define v #(3 4 5))
vector是一种比较常用的复合类型,它的元素索引从0开始,至第 n-1 结束,这一点有点类似C语言中的数组
通过以下代码可以了解:
guile> (define v (vector 1 2 3 4 5))
guile> v
#(1 2 3 4 5)
guile> (vector-ref v 0) ; 求第n个变量的值
1
guile> (vector-length v) ; 求vector的长度
5
guile> (vector-set! v 2 "abc") ; 设定vector第n个元素的值
guile> v
#(1 2 "abc" 4 5)
guile> (define x (make-vector 5 6)) ; 创建向量表
guile> x
#(6 6 6 6 6)
make-vector用来创建一个向量表,第一个参数是数量,后一个参数是添充的值,这和列表中的make-list非常相似。
我们可以看出,在scheme语言中,每种数据类型都有一些自己的基本用法,并且有和它相关的一些操作,比如字符串,列表等相关操作,这些操作都是非常有规律的,对于学过面向对象语言的来说,更类似于某个对象的方法,只不过表现形式不同而已。