特殊符号
宏:#
类似于其他语言里面的反斜杠转义字符,该符号用于标记特殊意义的部分。
#\ : 紧跟字符字符或者字符的名称,如 #\a
#' : 紧跟函数名,如 #'equal = function EQUAL
#b、#o、#x : 表示二进制、八进制、十六进制
# : 紧跟的是一个向量 vector
存储表示
Lisp 中一个cons cell 表示一个有两个指针的内存区域。通常可以如下表示
Cons cell
图中,箭头表示的是指针。在Lisp 的最常见的 List 数据结构中,左指针指向是 (car list),右指针指向的是 (cdr list)
(a b c d)
也可以这样表示
另外一种表示
如果 list 中有 其他list 元素,例如((a b) c (d e)),则可以这样表示
((a b) c (d e))
如果一个cons cell 里面的每个指针都指向⚛ 原子元素,那么可以近似地表示为dotted pair (a . b).该数据结构产生自(cons 'a 'b) 操作.
(cons 'a 'b)
注意: 这和 (a b) 表示的区别(setq x '(a b c))和(setq y '(a b c))在内存里将会以两个list 存储但是(setq x 'a)和(setq y 'b) 在内存里面的表示形式则是
image.png
注意: 任何 list 都可以用dotted pair 形式表示。例如 (a b c d) 可以写成(a . (b . (c . (d . nil)))),但是输出显示的时候还是(a b c d).但是请注意的是,(a . (b . (c . d)))在输出时将会显示为(a b c . d).
如果cons cell 为 (setq x ‘a ‘(d e)) 形式,则应该表示为
image.png
对比(setq y ‘(a d e))的结构则是
image.png
再看看(setq x ‘(a))的表示,和(setq x ‘a)有一定差别.
image.png
以下是(cons ‘a ‘(b))的表示,和(cons ‘a ‘b)也有一定的区别
image.png
等于函数
=: 参数为数字
equal: 参数为数据对象.判断标准为值相等.
eql: 参数为数据对象.判断标准为引用相同.
eq: 同上. 效率: eq > eql > equal. 以下程序示例将会说明使用的区别:
image
比较数字的需要注意的是: �equal 不关注对象是否有相同的存储结构,只是关心其值是否相等,但是 eq 就严格很多,需要比较值是否相等和存储结构是否相等.
常见数据对象的表示
Tables
Tables 是高频率使用的用于组织信息的数据结构。通常,Tables 在� Lisp 中的表示方式有很多种,最常见的是用 list 嵌套 list。例如,现在有一个电话本,有名字和电话号码两个字段,可以这样写
(setq table1 '((jones 1573 2 330 660)
(adams 1408 3 250 750)
(mitsu 4321 5 100 500)))
(defun print-table(tt)
(cond ((null tt) nil)
(t print (car tt)
(print-table (cdr tt)))))
可以使用一些函数获取 table 里面的数据.例如 assoc 函数
(assoc 'jones table1) ==> (JO