这一章节相当的无趣啊,而且对专业性有一定要求(数学)。来回把读了几遍,仍然感到晦涩。本想跳过,也罢,语言教学带些这种东东,似乎才显的专业啊。那就让我们开始吧~
本章要讲的是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
本篇略去了原文中许多数学概念,建议有需求、有功底的童鞋参看下原文。
(未完待续)