看到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).

lisp中的cons的更多相关文章

  1. 在Visual Lisp中处理自动化错误

    Handling Automation errors in Visual LISP 翻译自原文Kean's blog:http://through-the-interface.typepad.com/ ...

  2. Common Lisp中的读取宏 ' #' `( , ,@) #( ) #na( ) #<OBJECT> :Keyword

    当你把  xx 当做符号使用时   'xx  ,  这个符号是没有任何函数/变量语义的, 仅仅是一个 符号而已(就像一个string一样) 但你可以对这个string有其他的用法,比如使用它所bind ...

  3. Lisp中编写宏的步骤以及规范

    一.编写步骤 1.编写示例的宏调用以及它应当展开的代码,反之亦然. 2.编写从示例调用中生成手写展开式的代码. 3.确保宏抽象不产生"泄露". 二.遵循规则 1.除非有特殊理由,否 ...

  4. lisp中的nil

    ANSI Common Lisp 第二章 课后习题 7.只使用本章所介绍的操作符,定义一个函数,它接受一个列表作为实参,如果有一个元素是列表时,就返回真. (defun have-list (lst) ...

  5. PL真有意思(五):数据类型

    前言 现在大多数程序设计语言中都有表达式和/或对象的类型概念.类型起着两种主要作用: 为许多操作提供了隐含的上下文信息,使程序员可以在许多情况下不必显示的描述这种上下文.比如int类型的两个对象相加就 ...

  6. ANSI Common Lisp Practice - My Answers - Chatper - 3

    Ok, Go ahead. 1 (a) (b) (c) (d) 2 注:union 在 Common Lisp 中的作用就是求两个集合的并集.但是这有一个前提,即给的两个列表已经满足集合的属性了.具体 ...

  7. Lisp简明教程

    此教程是我花了一点时间和功夫整理出来的,希望能够帮到喜欢Lisp(Common Lisp)的朋友们.本人排版很烂还望多多海涵! <Lisp简明教程>PDF格式下载 <Lisp简明教程 ...

  8. 我终于理解了LISP『代码即数据|数据即代码』的含义

    以前我一直不能理解LISP里引用的作用,感觉引用和字符串没什么区别.比如:> (define (func)     'ok) > (func) 'ok 这里把引用ok当做了函数func的返 ...

  9. Lisp之根源

    原文:http://www.paulgraham.com/rootsoflisp.html 约翰麦卡锡于1960年发表了一篇非凡的论文,他在这篇论文中对编程的贡献有如 欧几里德对几何的贡献.1 他向我 ...

随机推荐

  1. SpringToolSuite/Eclipse中集成的Tomcat无法add Project时的解决版本

  2. eclipse插件

    #eclipse market http://www.eclipse.org/mpc/archive.php http://download.eclipse.org/mpc/mars/ #文件路径 p ...

  3. vue.js 2.0开发(3)

    组件化 Vue.component('todo-items',{ }); 定义组件,首先是标签的名字todo-items,然后里面还要配置一些选项,首先是我们的模板template,里面需要填入的内容 ...

  4. eclispe---快捷键设置

    1,eclipse自动补全的设置(自动提示) 2014-11-03 14:51:43 如果你用过Visual Studio的自动补全功能后,再来用eclipse的自动补全功能,相信大家会有些许失望. ...

  5. JS中两个感叹号!!的意义

    var foo = true; console.log(!foo); // false console.log(!!foo); // true 两个 !! 就是 非非 如果值为boolean值 两个感 ...

  6. Python 之 threading

    创建多线程常用的三种方法: 创建Thread的实例,传给它一个函数 创建Thread的实例,传给它一个可调用的类实例(不推荐) 派生Thread的子类,并创建子类的实例(推荐) 创建Thread的实例 ...

  7. linux命令-find {查找}

    一  命令解释 常用示例 :find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; path: find命令所 ...

  8. ubuntu12.04下一个简单的conky安装

    这个conky用一些漂亮的圆圈来显示cpu,时钟,内存,交换空间,硬盘信息,网络及天气信息(不需要登陆任何网站噢).而且,提供多种色彩方案供选择,带发行版标记(fedora,mint,debian,o ...

  9. logback 配置

    logback 配置 logback的配置方式包括:编程配置.XML文件配置.Groovy文件配置.对于使用log4j的用户,还可以通过logback提供的工具( http://logback.qos ...

  10. Windows MFC 两个OpenGL窗口显示与线程RC问题

    问题为:背景界面是一个OpenGL窗口(对话框),在其上弹出一个OpenGL窗口(模态对话框)时, 1.上方的OpenGL窗口能响应鼠标操作等并刷新: 2.当移动或放大缩小上方的OpenGL窗口时,其 ...