Scheme的数据类型

    Scheme中的数据非常之丰富!总的来说分两种,一种是简单数据类型,一种是复合数据类型。 简单数据类型中,又包含逻辑型,数值性,字符型和符号型这四种数据类型。 复杂数据类型,包含字符串型,向量型,点对型,和列表型。 下面分别简要介绍这些。
1:逻辑型
    这没什么好说的,就个真假问题,对应的数值是#t, #f这点请和c++中的true,false区别开来。 boolean? 这个过程,可以测试参数是否为逻辑型。
( boolean? #t) => #t
( boolean? #f) => #t
not 这个过程,和求逻辑非操作非常类似
(not #f) => #t
    注意,这两个例子,偶给的参数都是逻辑型,作为特例考虑,如参数不是逻辑型,而是别的类型数据,会如何?
(boolean? "Hello, world")
(not "Hello, world")
(boolean? 1)
(not 1)
   通过运行,可知,这四个语句,返回的都是#f,由此可知,只要这两个过程的参数非逻辑型,返回的都是#f
 2:数值型
    数值型,包括整数(32),分数(3/5),实数(1.234),复数(3+2i)
number? 测试是否是数值型,complex?测试是否为复数型,real?测试是否为实数,rational?测试是否为分数,integer?测试是否为整数
(number? 32) => #t
(number? 1/3) => #t
(number? 2+3i) => #t
(number? 1.111) => #t
(number? "hello, world") => #f
(complex? 1+2i) => #t
(real? 2+3i) => #f
(real? 3.1416) => #t
(real? 22/7) => #t
(real? 42) => #t
(rational? 2+3i) => #f
(rational? 3.1416) => #t
(rational? 22/7) => #t
(integer? 22/7) => #f
(integer? 42) => #t
   scheme的整数,并不一定非要是十进制,也可以通过前缀来识别二进制(#b),八进制(#o),十六进制(#h)和可选的十进制前缀(#d),如#b1111,#o17,#hf,#d15,都是代表十进制中的15.
   整数的比较运算 eqv? 比较两个整数是否相等(eqv? 11 12) 当然你也可以用=来代替,如(= 11 12)和上面的语句是等效的 另外,还有<, <=, >, >=
(< 1 2) => #t
(> 1 2) => #f
(<= 1 2) =>#t
(>= 1 2) =>#f
    关于整数的算数运算+, -, *, /, expt
(+ 1 2 3) => 6
(- 5.3 2) => 3.3
(- 5 2 1) => 2
(* 1 2 3) => 6
(/ 6 3) => 2
(/ 22 7) => 22/7
(expt 2 3) => 8
(expt 4 1/2) => 2.0
   关于-, /的单目运算
(- 1) => -1
(/ 4) => 1/4
   求最大,最小数max, min
(max 1 2 3 4 5) => 5
(min 1 2 3 4 5) => 1
    就绝对值abs, 3:字符型 字符型,用前缀#/开始,如#/c, #/b是c,b的字符,非打印字符,可以在前缀后面加描述名,如#/newline, #/tab, #/space 字符间的比较谓词:char=?, char?, char>=?.
(char=? #/a #/a) => #t
(char? #/a) #t
(char>=? #/a #/b) => #f
   如果要它为大小写不敏感的比较,只需用用char-ci代替char就可以,如
(char-ci=? #/a #/A) => #t
    大小写字符转换 char-downcase 和char-upcase
4:符号型
    呵呵,这个符号名,有些类似枚举型,就是起个名字而已,不需要用他的数值含义,仅仅需要用这个的符号,也就是名字的含义而已。,比如red, blue,偶们不需要知道他red,blue各自的数据具体是多少,仅仅需要知道red代表红死,blue代表蓝色就够了 符号的定义用quote来定义的(quote red)当然,这个用的非常频繁,为了简化起见,有个简单的定义,就是加个'如'blue 下面介绍几个用于符号类型的过程symbol?测试是否为符号型,eqv?测试两个符号类型值是否相等,注意,这个是不区别大小写的。
(symbol 'red) => #t
(symbol 123) => #f
(eqv? 'red 'RED) => #t
(eqv? 'red 'blue) => #f
    偶们可以用define来定义个全局变量(define abc 9),用set!来改变定义的值,注意,可以改变数据类型,如
(define abc 9) abc => 9
(set! abc #/c) abc => #/c

5:字符串
   这个不用多说了,需要说明的是它是用双引号引起来的字符串。
“hello" => "hello"
   下面,需要说明的是字符串中使用的过程/函数 string,这个函数,可以把一系列字符,绑定成字符串
(string #/h #/e #/l #/l #/o) => "hello"
string-ref,提取字符串中的特定字符,字符串从0开始计数
(define hello "Hello, world")
(string-ref hello 0) => #/H
string-append把一个字符串,添加到另外一个字符串的后面
(string-append "Hello " "world") => "Hello world"

6:向量 向量是一个序列,如字符串也是个序列,但是向量的元素类型是可以任意的
(vector 12 "Hello" #/c) => #3
(12 "Hello" #/c)

7:点对
  点对,是两个任意有序值的组合。第一个元素称为car,第二个元素称为cdr
(define x (cons 1 #t))
(car x) => 1
(cdr x) => #t
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值