lisp中的cons

编程入门 行业动态 更新时间:2024-10-08 06:18:55

<a href=https://www.elefans.com/category/jswz/34/1754831.html style=lisp中的cons"/>

lisp中的cons

看到ANSI Common Lisp 第三章的游程编码时,就发现作者很准确的使用了list和cons来生成目标列表,虽然list是由cons扩展而来,区别也仅仅是最后一个元素的加入方式,于是勾起了之前对cons的疑问.

当看到下面的这样的代码:

(cons '(a b) '(c d))

你会觉得输出结果是

((a b) (c d))

还是

((a b) c d)

虽然敲入一下代码,就知道是后者,可是,为什么呢?

仔细看第三章cons的说明,发现cons放在c语言里面,无非就是一个如下的结构

typedef struct _cons cons;
struct _cons
{void*     content;   //cons的内容cons*     next;
}

然后我们仔细观察cons的动作就会发现cons产生"参数个数-1"个新cons对象来连接这些参数,并且做类似如下的操作:

cons new, a, b, c, d;
a.content = (void *)'a';
a.next = &b;
b.content = (void *)'b';c.content = (void *)'c';
c.next = &d;
d.content = (void *)'d';new.content = (void *)&a;
new.next = &c

你会发现(a b)成为了新cons对象的内容,而c成为了新cons对象的下一个对象,而d又刚好是c对象的下一个cons对象,很自然的new对象就和c,d这两个对象在一条链表上了.而a,b这2个对象虽然也组成了一个链表,但是是作为新对象的内容来存储的,也就是一条支线.

所以(cons '(a b) '(c d))的返回结果也很准确的反应了这条链表的维度关系((a b) c d).

转载于:.html

更多推荐

lisp中的cons

本文发布于:2024-02-06 11:15:54,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1748574.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:lisp   cons

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!