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
发布评论