结构大样lisp_Common Lisp 数据结构实现

特殊符号

宏:#

类似于其他语言里面的反斜杠转义字符,该符号用于标记特殊意义的部分。

#\ : 紧跟字符字符或者字符的名称,如 #\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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值