lisp初体验-Practical Common Lisp笔记-12.数字、字符、字符串

这一章节相当的无趣啊,而且对专业性有一定要求(数学)。来回把读了几遍,仍然感到晦涩。本想跳过,也罢,语言教学带些这种东东,似乎才显的专业啊。那就让我们开始吧~

 

本章要讲的是lisp内建的三种"原子型标准格式":数字,字符,字符串。严格来说,字符串应该算是字符的组合体,不过鉴于其特殊性(估计没有什么现代语言不默认支持字符串的吧),也一并算在里面了。

 

说到数字,很容易就会联想到数学--还有比这更繁复的东西么?Lisp不会让数学变得简单,不过至少,相对于其他语言而言,数学在Lisp中会显得简单、清晰的多。(它本身作为数学工具被发明出来的...)。在Lisp中,你能写出任何你能想到的数字(自己去想),做任何你想要的计算(同上)

 

小学毕业的童鞋应该都知道:一个数字是可以有多种书写方式的,在Lisp中,多种书写方式最终只会呈现出一种结果:

 

CL-USER> 10
10
CL-USER> 20/2
10
CL-USER> #xa
10
 

 

以下是常用的一些对应关系:

 

123                            ==> 123
+123                           ==> 123
-123                           ==> -123
123.                           ==> 123
2/3                            ==> 2/3
-2/3                           ==> -2/3
4/6                            ==> 2/3
6/3                            ==> 2
'二进制
#b10101                        ==> 21
#b1010/1011                    ==> 10/11
'八进制
#o777                          ==> 511
'十六进制进制
#xDADA                         ==> 56026
'三十六进制,#nr(n代表进制数)
#36rABCDEFGHIJKLMNOPQRSTUVWXYZ ==> 8337503854730415241050377135811259267835

 

 浮点类型的:

 

1.0      ==> 1.0
1e0      ==> 1.0
1d0      ==> 1.0d0
123.0    ==> 123.0
123e0    ==> 123.0
0.123    ==> 0.123
.123     ==> 0.123
123e-3   ==> 0.123
123E-3   ==> 0.123
0.123e20 ==> 1.23e+19
123d23   ==> 1.23d+25

 

 复数类型的:

 

#c(2      1)    ==> #c(2 1)
#c(2/3  3/4)    ==> #c(2/3 3/4)
#c(2    1.0)    ==> #c(2.0 1.0)
#c(2.0  1.0d0)  ==> #c(2.0d0 1.0d0)
#c(1/2  1.0)    ==> #c(0.5 1.0)
#c(3      0)    ==> 3
#c(3.0  0.0)    ==> #c(3.0 0.0)
#c(1/2    0)    ==> 1/2
#c(-6/3   0)    ==> -2

 

 

基础数学运算:

 

(+ 1 2)              ==> 3
(+ 1 2 3)            ==> 6
(+ 10.0 3.0)         ==> 13.0
(+ #c(1 2) #c(3 4))  ==> #c(4 6)
(- 5 4)              ==> 1
(- 2)                ==> -2
(- 10 3 5)           ==> 2
(* 2 3)              ==> 6
(* 2 3 4)            ==> 24
(/ 10 5)             ==> 2
(/ 10 5 2)           ==> 1
(/ 2 3)              ==> 2/3
(/ 4)                ==> 1/4

(+ 1 2.0)             ==> 3.0
(/ 2 3.0)             ==> 0.6666667
(+ #c(1 2) 3)         ==> #c(4 2)
(+ #c(1 2) 3/2)       ==> #c(5/2 2)
(+ #c(1 1) #c(2 -1))  ==> 3
(incf x)    === (setf x (1+ x)) === (setf x (+ x 1))
(decf x)    === (setf x (1- x)) === (setf x (- x 1))
(incf x 10) === (setf x (+ x 10))
(decf x 10) === (setf x (- x 10))

  数值比较:

 

(= 1 1)                        ==> T
(= 10 20/2)                    ==> T
(= 1 1.0 #c(1.0 0.0) #c(1 0))  ==> T

(/= 1 1)        ==> NIL
(/= 1 2)        ==> T
(/= 1 2 3)      ==> T
(/= 1 2 3 1)    ==> NIL
(/= 1 2 3 1.0)  ==> NIL

(< 2 3)       ==> T
(> 2 3)       ==> NIL
(> 3 2)       ==> T
(< 2 3 4)     ==> T
(< 2 3 3)     ==> NIL
(<= 2 3 3)    ==> T
(<= 2 3 3 4)  ==> T
(<= 2 3 4 3)  ==> NIL

(max 10 11)    ==> 11
(min -12 -10)  ==> -12
(max -1 2 -3)  ==> 2

 

 字符、字符串比较格式对比:

CHAR=      STRING=    
/=CHAR/=STRING/=
<CHAR<STRING<
>CHAR>STRING>
<=CHAR<=STRING<=
>=       CHAR>=STRING>=

 

注意:现在的lisp都已21bit的unicode为默认编码(大部分)

 

由于string类型本身是字符的列表形态,所以比较格式也能玩出一些新的花样:

(string= "foobarbaz" "quuxbarfoo" :start1 3 :end1 6 :start2 4

 

本篇略去了原文中许多数学概念,建议有需求、有功底的童鞋参看下原文

 

(未完待续)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值