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语言中,每种数据类型都有一些自己的基本用法,并且有和它相关的一些操作,比如字符串,列表等相关操作,这些操作都是非常有规律的,对于学过面向对象语言的来说,更类似于某个对象的方法,只不过表现形式不同而已。



猜你喜欢

转载自blog.csdn.net/weixin_40389330/article/details/80957781