lisp初体验-Practical Common Lisp笔记-12.数字、字符、字符串
这一章节相当的无趣啊,而且对专业性有一定要求(数学)。来回把读了几遍,仍然感到晦涩。本想跳过,也罢,语言教学带些这种东东,似乎才显的专业啊。那就让我们开始吧~
?
本章要讲的是lisp内建的三种"原子型标准格式":数字,字符,字符串。严格来说,字符串应该算是字符的组合体,不过鉴于其特殊性(估计没有什么现代语言不默认支持字符串的吧),也一并算在里面了。
?
说到数字,很容易就会联想到数学--还有比这更繁复的东西么?Lisp不会让数学变得简单,不过至少,相对于其他语言而言,数学在Lisp中会显得简单、清晰的多。(它本身作为数学工具被发明出来的...)。在Lisp中,你能写出任何你能想到的数字(自己去想),做任何你想要的计算(同上)
?
小学毕业的童鞋应该都知道:一个数字是可以有多种书写方式的,在Lisp中,多种书写方式最终只会呈现出一种结果:
?
CL-USER> 1010CL-USER> 20/210CL-USER> #xa10?
?
以下是常用的一些对应关系:
?
123 ==> 123+123 ==> 123-123 ==> -123123. ==> 1232/3 ==> 2/3-2/3 ==> -2/34/6 ==> 2/36/3 ==> 2'二进制#b10101 ==> 21#b1010/1011 ==> 10/11'八进制#o777 ==> 511'十六进制进制#xDADA ==> 56026'三十六进制,#nr(n代表进制数)#36rABCDEFGHIJKLMNOPQRSTUVWXYZ ==> 8337503854730415241050377135811259267835
?
?浮点类型的:
?
1.0 ==> 1.01e0 ==> 1.01d0 ==> 1.0d0123.0 ==> 123.0123e0 ==> 123.00.123 ==> 0.123.123 ==> 0.123123e-3 ==> 0.123123E-3 ==> 0.1230.123e20 ==> 1.23e+19123d23 ==> 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
?
本篇略去了原文中许多数学概念,建议有需求、有功底的童鞋参看下原文。
?
(未完待续)
?
?